Integrate memory and disk layers in view rendering.

For any op, first try to get the closest data from memory. If we aimed past the earliest point in memory, try reading more data from disk.

Future optimizations could include reusing an iterator for each timeseries instead of creating a new one for every access (since we usually seek linearly through the timeseries).

Some aspects of this implementation might be surprising (like why not use a frontier-like structure to track whether we should access memory at all), so feel free to chat with me about it :)