Refactor async-backend compatibility layer
Our current async backend layer is a bit kludgey. We should build it around something more trait based, possibly using
async_executor. Ideally, nothing in other crates would have to call tokio or async-std except via a trait.
(We can't just use
async_executor as is: we'll also need a generic listener type, a generic TLS connection factory type, a sleep typpe, and possibly more.]