Use an atomic variable for async blocks

This allows an `AsyncBlock` to invoke `done()` from another thread (in addition to asynchronously on the current run loop).