Speedups, bugfixes, and fleshing out current AbstractDataFrame API

@tshort The third commit is the one of interest, where I shuffled around code between DataFrame and AbstractDataFrame, and fleshed out a transient interface
Sounds good. I guess my thought was that `AbstractDataFrame` would remain the top type, and that methods could be factored out into new subtypes if/when a new type is added that can't handle every method currently defined on `AbstractDataFrame`. Regarding coming changes, I'd guess any work we do end up around inheritance is likely to translate pretty well to traits/interfaces, so while I'm having trouble envisioning what new data frame types will look like, I wouldn't let that hold you back from testing `CompositeDataFrames`, for example.