Implements an input range interface on top of an InputStream using an internal buffer.
The buffer is GC allocated and is filled chunk wise. Thus an InputStream that has been wrapped in a StreamInputRange cannot be used reliably on its own anymore.
Reading occurs in a fully lazy fashion. The first call to either front, popFront or empty will potentially trigger waiting for the next chunk of data to arrive - but especially popFront will not wait if it was called after a call to front. This property allows the range to be used in request-response scenarios.