Add DataReader

Adds a (optional caching) DataReader class that emits pandas DataFrames