Because of that missing runtime for scheduling and evaluating IO-ful things, tools like superfunctions are necessary.
In other words: IO monads are only as useful as the thing that evaluates them; Python doesn't have a built-in way to do that, so people have to make code that looks "upward" to determine what kind of IO behavior (blocking/nonblocking/concurrent/lazy/etc.) is needed.
Monad-agnostic functions are exactly looking upwards to allow the calling context to determine behaviour.
There’s no reason a python-like language couldn’t have deeper semantics for async, and language level implementation.
You seem to know a lot about PL. Could you elaborate on that reason and on the maintenance burden of a preemptive runtime?