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.
Fix collect([]) + add test
Simplify setvalue/setexception: Use `with self._lock`
Simplify unit: onsuccess/onfailure -> map
Simplify proxyto: Chain return
Add eval
Fix foreach: Should return self, like onsuccess
Fix test_updateifempty: Future.updateifempty -> Promise.updateifempty
Simplify onsuccess: Promise.call -> self.respond
Simplify onfailure: Promise.call -> self.respond
Simplify ensure: Promise.call -> self.respond
Add transform
Simplify flatmap: Promise.call -> self.transform
Simplify rescue: Promise.call -> self.transform
Simplify handle: Promise.call -> self.rescue
Simplify map: Promise.call -> self.flatmap
Simplify filter: Promise.call -> self.flatmap
Simplify or_: Promise.call -> Promise.select
respond: Don't Promise.call + die on uncaught exceptions
Merge branches 'collect-join-select-no-timeout-no-thread' and 'various-suggestions' into develop