Reasoning About Async Rust with State Machines

Build the state machine behind an async fn, then use that model to reason about common async bugs and compiler errors.