collect, join, select: Don't spawn thread + remove timeout arg

@duckworthd Here's a better impl of collect than the simple reduce impl
we discussed yesterday, which I realized had a bad behavior where a
fast-failing future at the end of the list wouldn't fail the collected
future until all futures before it were fulfilled, since they were
chained left to right using reduce.

I also went ahead and added a new impl for select, along similar lines.
Both follow the twitter/util impls pretty closely.