simple case: send a lazy list of events

sendEvent sends a pure event, so makes sense of sendEvents to send a
pure lazy list of events. The list must be infinite, or we risk running
out of events too early.

The function which generates events as needed has been renamed
generateEvents.
SuspendT version of sendEvents etc.

There is no isDoneT because we need to evaluate side effects in order to
determine whether the suspendable computation has halted yet. Better use
runSuspendT.
Print letters as they are typed

The monad-transformer version indeed allows suspendable computations to
interleave side effects between calls to nextEvent.