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.