Update the nomenclature in the Future specs

Futures are resolved, promises are fulfilled.
Remove stray whitespace in the Future specs
Update the descriptions to the Future#flat_map specs
Avoid tap when not necessary

Future#{map,flat_map,recover,fallback} are all hot paths and shouldn't do unnecessary method calls.
Add Future#then

It's similar to then from Promises/A+, but not identical. The idea is to make it possible to either return a promise or not, depending on the context.
Fix whitespace in the Future#recover docs
Add Future.traverse
Add Future.reduce
Fix whitespace in the Future docs
Refactor Future.reduce

Separate the ordered and unordered cases into separate classes.

I wanted to make the solution completely stateless, but didn't manage to do it. It's possible for each case separately, but without duplication I don't know how to do it.
Pass the value/error to Future#on_complete callbacks
Redefine all Future composition in terms of #on_complete

This makes it easier to duck type futures, all you need to do is implement #on_complete, instead of #on_value and #on_failure.
Add specs that test future composition with #on_complete

Future.reduce does not conform to this pattern yet.
Change Future.reduce to allow #on_complete composition
Fix Future.reduce with no initial value

It becomes a fold, like Array#reduce
Remove a inconsistent test from the Future specs

I don't know what it was trying to test, I think it was a partial copy/paste thing that just got left in some time in the distant past.
Change Future.all and .first to accept an array as first argument
Fix Future.reduce to return the initial value when there are no futures
Make Future.all, .first, .traverse and .reduce accept Enumerables

.reduce converts the Enumerable to an Array, the other only use #each.
Fix Future.all and .first with enumerable arguments

Only if there is a single argument should they assume that it is an enumerable.