Deferred computation is a primitive, and threads do not solve it.
Any fundamentally blocking operations could be forced by the compiler to have have two implementations - sync (normal) and async, which defers to some abstract userspace scheduler that's part of the language itself.
The choice and ordering and soforth of yield points / poll order really drastically can change the semantics of your program. But if you don’t care..