How Rust models generators and async functions as memory efficient state machines: https://tmandry.gitlab.io/blog/posts/optimizing-await-1/