Consume the input stream lazily

Data is no longer consumed from the stream in advance, it is only read when requested (i.e. the iterator is dereferenced). Or if the iterator is advanced without dereferencing, the previous data is consumed (and ignored). This allows constructions such as `istream_range<string>(cin) | take(0)` to work as expected, consuming exactly the quantity of data requested from the input stream (in this case, none), instead of consuming 1 more than requested.