Abstract API for Suspend's caller

Suspendable computations can use return and nextEvent instead of using
Done and Suspend directly, and now the rest of the code doesn't need to
know about Done and Suspend either. This is good, because soon I plan to
change the implementation to use a monad transformer.
Documenting the purpose of Suspend

In particular, why not just use a function of type ([e] -> a)? Because
with such a function, the caller could not use side effects to generate
the events, it would need a pure computation generating an infinite lazy
list.
Monad transformer version of Suspend

Side effects can now be interleaved with event requests.