I wonder how would you handle waiting on several
signals?
First, it needs cancellation (coming in part 3).
Given that, I usually implement a `wait_any()` utility. The inputs can be any function that uses return of control to signal the event. (For example, the async_wait() method of Event.) Then:
```
-- run these functions concurrently; when one returns, cancel the others
async_wait_any(
event_foo.async_wait,
async_wait_for_bar,
async_do_baz,
...)
```