Create a base CachedDataProvider.

I wrote my own DataProvider since I don't have Orion.  I had to figure out and reuse a bunch of the plumbing code from OrionDataProvider, so I put it into a generic base class to make it easier for others to create DataProviders.

OrionDataProvider could be rebased on this class pretty trivially.  I can do that, but I wouldn't be able to test it.