Alternative implementation of the pipes concept.
The Pipe type is Pipe lo a b u m r, where:
lois eitherLeftoversorNoLeftoversais the input typebis the output typeuis the upstream return typemis the base monadris the return type
The primitive stream operations are:
tryAwaitwaits for upstreamyieldor terminationyieldyields a value to downstream
The await operation is provided via EitherT, and a corresponding withAwait to
unwrap the EitherT at the top level.
Exceptions and finalization are to be decided.
Note that simulatePipe is the fundamental abstraction for running a Pipe. The more
widely known runPipe is provided as a specialization.