Expansion to the utilities provided in FutureUtils

This adds more ways to get a ListenableFuture for a collection of futures.
In addition we only need an iterator, and not a whole collection.  This allows us to tolerate collection modifications while we are setting up the resulting future.

It also allows you to get different results for the provided futures.  For example you can get only the futures that failed.