Async ci fetch
Make cache.pipeline_result_for_id() and cache.trace_results_for_id() asynchronous, returning a future instead of the result directly. This allows the view to fetch results concurrently, significantly reducing the page loading time when results are not in the cache (on my system the landing loading time goes from ~50s to ~10s).
To avoid problematic concurrent database interactions, access to the the db is serialized with a thread lock.