It is not just better, closer to reality semantics (someone have to wait), but also better granularity (one connection/channel, one process), shorter, less confusing code.
My guess is that the choices were made on the basis on meme/popularity among ignorant coders (to attract more devs, to gain more momentum, etc) rather than tech per se.
To have a select and receive as a language constructs (with pattern matching, of course) and coroutines (basically, software interrupt handlers) is a much better approach for a system programming language, just by being close to a system.
Universal frameworks like tokyo or async/await is cancer and , it seems, does not suit a system language at all.