Implement asynchronous searches for various ghc-debug-brick analyses
Implements asynchronous heap traversals for:
- Thunk analysis
- Strings
- ArrWords
- Profiles level 1 & 2
Thunk analysis is also now performed in parallel, which speeds it up tremendously.
The heap traversals happen on a separate thread and every second, we ask for the current state of the traversal. Then we simply update the view and make sure the IOTree is in a consistent state.
We introduce async variants of various heap traversals.
Last but not least, we improve the async safety of the parallel heap traversal to use async primitives in a more direct manner.
This ensures that threads get timely cancelled if one of the operations is cancelled or crashes.