This is an attempt to translate the core example from "Domain Modelling Made Functional" by Scott Wlaschin. As you can probably see there is no nice way to do async functions as arguments / async closure returns in Rust.
This is real messy, and unless the core language changes a lot I would not encourage you to go through the same pain I've gone through here.
[Update: Thanks to the async_fn_traits crate, this has been greatly improved!!!]
This was a mistake.