implement streaming requests

This is what `ByteStream.expectSize()` is for...

It may seem a little awkward for your `ByteStream` implementation to have to wait for `expectSize()` before it sends headers to the app. But, when I was playing with interface options for the object storage layer I'm working on, this seemed more composable than having every interface which creates a new `ByteStream` take a size hint as a parameter.