implement streaming requests

Be sure to keep a running byte count so that you can throw an exception and abort the HTTP connection if too much data is written or `done()` is called prematurely. Otherwise, there is an HTTP injection attack possible here if the `ByteStream` happens to be passed off to someone malicious. I don't want to assume that the caller of this interface is necessarily the trusted Sandstorm front-end; the intent of `UiView` (and hence `WebSession`) is that you can actually pass it off to another app or perhaps to an external client to be called directly.