AsyncChan is a bit of an aberration. You can use it just like AsyncSTM, but once you've obtained the result, it's not longer useful, because subsequent reads will block.
I think we should either think of a useful API for this - e.g,. a handle that can be used to refer to the results of multiple asynchronous tasks via a compositional API - or get rid of it altogether.
I'm open to suggestions here. If we do remove it, we can get rid of the abstraction layer in Async and pull AsyncSTM up.