Don't wait for timeout for results to be returned.

Adds a separate error channel for errors, and tracks the total number
of responses returned, exiting early when everything has come back.
Other misc cleanups.