Wrapping specialized interrupt handlers into some higher lebel API, such as AIO, is the right way.
Async/await is a mess. Concurrency cannot be generalized to cover all the possible cases. It must have specialization.
Engineers of old times who created the early classic OSes were bright people, contrary to current hipsters.
Once popularized, flawed abstractions and apis such as pthreads would stick (only idiots would accept shared stack and signals).
Look at how an OS implements concurrency and wrap it into higher level API. That's it.