adds asyncJoin to Revision

This branch seems like it should be mostly complete, but it seems to have made a few tests flaky, and it uses twitter-style Futures, which I'll have to convert to scala-style Futures.

When I convert them to scala-style futures, "ensure" and "map" will need an ExecutionContext.  Do you know if there's an built-in execution context which says, "if this promise has already completed, execute on this thread, if it hasn't, execute on the thread that completes it"?  I don't think we should need to shell out to a new thread pool for this, and it should help cut down on context switches.