Added Ref.recoverWith, RefMany.recoverManyWith, RefMany.whenReady. Removed RefMany.onReady

Ref (singular) can result in something, nothing, or failure (possibly asynchronously).  orIfNone handles the nothing case.  recoverWith handles the failure case.

RefMany (plural) can result in zero-or-more-things, or failure (possibly asynchronously). recoverManyWith handles the failure case

Note that RefMany.recoverManyWith and Ref.recoverWith have different names. This is necessary because both appear on RefNothing (and type erasure would also cause them to have the same typed arguments at runtime)

RefMany.whenReady(f) replaces RefMany.onReady(onSuccess, onNone, onFailure)
RefMany.onReady's "onNone" case could not be handled correctly and efficiently (e.g. by a RefTraversableRef(RefFuture) which would need to know whether all its future elements eventually ended up being nothing).
Generally, usage of RefMany.onReady, minus the onNone case, can be replaced by
RefMany.whenReady(onSuccess).recoverWith(onFailure)
Added mechanism to set headers in DataAction.returning methods (partial commit -- see TODO)

DataAction.returning methods now expect the block to return a WithHeaders(Ref[T], Ref[HeaderInfo])

If the block just returns a Ref[T], it is implicitly converted to WithHeaders(data, headerInfo=RefNone)

TODO: Apply headers even if the data fails.
Because the data and headerInfo are in separate Refs, headers could be applied even if the data result is a failure. However, this commit does not do that yet.