- Remove confusing use of atomics. Use return values of async tasks
instead, to ensure all tasks are awaited.
- Remove use of `println!()`, which uses a global lock and cannot be
executed in parallel.
The goal here was to get the first bit of "muscle memory" for using the
async and await keywords. The little story should make it more intuitive
for users why asynchronous programming is needed in the first place.
This exercise will be moved to the location corresponding to the book in
a later commit, to keep the diff of this one clean.