ES6 generators as coroutines

Allows `yield`ed functions to return promises and act like blocking.  This includes the usual `call`, `apply`, and `lift` functions, plus `compose` that will compose generators.