`std.range.chunks` was extended to support non-forward input ranges.

Now `std.range.chunks` can be used with input ranges that are not forward
ranges, albeit with limited semantics as imposed by the underlying range.

---
import std.algorithm.comparison : equal;

int i;

// The generator doesn't save state, so it cannot be a forward range.
auto inputRange = generate!(() => ++i).take(10);

// We can still process it in chunks, but it will be single-pass only.
auto chunked = inputRange.chunks(2);

assert(chunked.front.equal([1, 2]));
assert(chunked.front.empty); // Iterating the chunk has consumed it
chunked.popFront;
assert(chunked.front.equal([3, 4]));
---
