All these posts about async are making the freedom to choose our runtime seem like a bad thing.
For most people, we can just accept Tokio as the de facto standard, and everything is good. Having the other runtimes only makes things better. Don't do anything weird and it won't be too much work if you need to change.
Any big change you miss is bound to either be implemented in Tokio or be too different for any abstraction to save you from the work.
If you're writing a library that you want to be reusable by everyone, I understand your frustration that it's not easier to make it universal for all async runtimes. You can still choose one, minimize the code you would have to change to implement others, and appreciate that in almost every other programming language you don't get more than one async engine anyway.
Yes, the ergonomics sucks. But to be fair, Rust's ergonomics kind of suck too, especially when you do anything remotely complicated. Unfortunately, I think that's just a natural consequence of Rust's memory safety guarantees.
So yeah, it's probably fine, and maybe it can't be much better, but it still kind of sucks to use (esp. if you're new to it).