Add applicative, improve earliest() and join().

earliest() now ensures that when both inputs are pending, the returned future will have exactly the same time as the earlier of the two.  IOW, earliest now always returns a future that is indistinguishable from the earlier of its inputs.

join() now ensures that the returned future will have the value of the inner future and the same time as the *later* of the outer and inner futures.  IOW: join ~= { time: Math.max(outerTime, innerTime), value: innerValue }