Improve reduce and reduceRight perf

This uses recursion (which will be trampolined--no call stack
concerns), and is 2-3x faster than the previous version which used
Array.prototype.reduce.  The code is a lot uglier than it should be
due to having to deal with sparse arrays.  At least half the new code
is for sparse arrays :( Yet another reason to drop sparse array
support in 4.0.
Inline sparse array find first/last
Improve node.apply/call/lift perf. Reduce mem usage

There are now zero closures in makePromise, and zero on the hot path
of when/node apply/call/lift.  This improves the perf and reduces mem
usage of promise.fold, and when/node call/apply/lift.