async-2.1.0: Run IO operations asynchronously and wait for their results

# async-2.1.0: Run IO operations asynchronously and wait for their results

This package provides a higher-level interface over threads, in which an `Async a` is a concurrent thread that will eventually deliver a value of type `a`. The package provides ways to create `Async` computations, wait for their results, and cancel them.

Using `Async` is safer than using threads in two ways:

- When waiting for a thread to return a result, if the thread dies with an exception then the caller must either re-throw the exception (`wait`) or handle it (`waitCatch`); the exception cannot be ignored.
- The API makes it possible to build a tree of threads that are automatically killed when their parent dies (see `withAsync`).

Modules

- Control
  - Concurrent
    - Control.Concurrent.Async