Optimize windowing and chunking function on series

This makes `Series.windowInto 10 Series.mean` about 5 times faster than previously.
Previously, the code was actually building index for each of the windows (by creating
an array of keys and then allocating a new index). This change implements
`LinearRangeIndex` which represents a virtual index over a subrange of a parent index
(thanks to immutability!) So, for the common cases like the above, we do not actually
need to allocate a new index.