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.]