We had a pair of large, complicated iterators to handle fetching all
the segment data, and they were hard to read and think about. I tried
to break them out into some simpler pieces:
* one to handle coalescing multiple requests to the same segment
* one to handle fetching the bytes from each segment
* one to check that the download isn't taking too long
* one to count the bytes and make sure we sent the right number
* one to catch errors and handle cleanup
It's more nesting, but each level now does just one thing.
Change-Id: If6f5cbd79edeff6ecb81350792449ce767919bcc