Pull request #1159: PIPE-2014: improve the timing stats in timetracker.json and weblog
Merge in PIPE/pipeline from PIPE-2014-improve-timetracker-and-weblog-timing-stats to main
* commit '38d910f91e9b3fbbf159b54bc4a0f0c17e2d4b60': PIPE-2014: Use `datetime.timezone.utc` instead of `datetime.UTC` for Python 3.10 compatibility PIPE-2014: Update task duration mapping to use integer keys for stage numbers in timetracker PIPE-2014: Improve task duration formatting in HTML renderer and Mako template PIPE-2014: Revert to the old approach of tracking weblog rendering duration - restricted to rendering of per-stage task result page PIPE-2014: Switch to timezone-aware `datetime` in UTC for recording timestamps from `timetracker` PIPE-2014: Switch to `shelve.open()` which returns a shelf object that is a context manager since Python 3.4 PIPE-2014: Ensure `TaskCompleteEvent` is sent for non-"multi_vis" tasks. PIPE-2014: add back a code block accidentally removed from the last merge conflict resolution. PIPE-2014: use the timetracker event stats for task duration calculations. PIPE-2014: optimize the renderer execution order for more accurate timing stats displayed in the weblog. PIPE-2014: start the weblog creation timer at the beginning of weblog rendering.