That's a good question. I think the tie-in with Tokio mostly relates to a couple of things:
1. calls to `tokio::spawn`
2. async I/O traits like `AsyncRead`/`AsyncWrite`
3. direct usage of Tokio I/O
For 1, it would be great if more libraries switched to using more structured concurrency primitives instead of using spawn. In the cases where it does make sense to have a spawning function, it would be nice if they used crate-exported traits like [hyper::rt::Executor](https://docs.rs/hyper/latest/hyper/rt/trait.Executor.html) so that the functionality could be abstracted over different runtimes.
For 2, hopefully those traits will eventually be standardized in std.
For 3, it would also be nice if the necessary functionality were abstracted into crate-exported traits that were implemented for the Tokio structs.
Buuuut, all of that said. It's thorny and a lot of the ecosystem is indeed wedded to Tokio.