PERF/ENH: Dramatically speed up getting "table of contents" for storage

It turns out that pandas' HDFStore, and consequently our frame-based storage class, is horribly slow at determining its keys(). The underlying HDF5 operation is of course extremely fast. The `pytables` docs don't disclose a way of doing it efficiently, but it turns out that `dir(store.root)` works well. It's a bit of a hack, but it's worth it.

```
fstor = tp.PandasHDFStore(mov.p / 'features.h5', 'r')

len(fstor) # Long movie
2134

%%timeit
fstor.store.keys() # Old technique
1 loops, best of 3: 6.72 s per loop

%%timeit
fstor.keys() # New technique
100 loops, best of 3: 2.72 ms per loop
```

As you can see, while I was at it, I added `keys()`, `__len()__` and `__getitem__()` methods to make storage classes a little more Pythonic, and refactored the classes so that more of the busy work is done in the base class. I think this is the right way to go, because it makes it as easy as possible to add formats: write `__init__`, `put`, `get`, `keys`, `close`, and `t_column`, and you're done. (If there are more efficient ways to do the other things, you can always override them.)

I also improved test coverage a bit, and added tests for `PandasHDFStoreSingleNode`.