- I wrote the generic associated types RFC (how Rust will implement higher kinded polymorphism).
- I wrote the const generics RFC (the closest Rust will get to dependent types).
- I wrote the async/await RFC, as well as the linked blog post.
That is to say that I am intimately familiar with how Rust's type system can be extended to support more "powerful" abstractions.
Monads as implemented in pure functional programming languages like Haskell cannot usefully abstract over asynchronous and synchronous IO in Rust for a variety of reasons having to do with the way the type system exposes low level details by virtue of Rust being a systems programming language. I do not believe that `do` notation could be a useful mechanism for achieving either the ergonomics or the performance that async/await syntax will have in Rust.
I'm responding to you because you're the top comment, but I could write a similar response to a lot of comments here. Monads, stackful coroutines, green threads, CSP, etc - we've heard of them! :) We have well-motivated reasons to choose async/await: its the only solution that meets our requirements.