An implementation of IO computations that return their value asynchronously.
Async a represents a value
a that is being computed
asynchronously, i.e. a value that is going to become available at
some point in the future.
Throw an asynchronous exception to the thread that performs the computation associated with this value.
Wait for the asynchronous value to become available, and retrieve it. If the computation that generated the value has thrown an exception, then that exception will be raised here.