Make runStream use promise trampoline

This avoids blowing the call stack for very large streams that would
otherwise be able to run synchronously.  The perf impact is miniscule
since this only introduces a trampoline at the outermost part of the
runStream "loop".