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
The existing code didn't work for SubDataFrames, and it's unclear how it would work / whether it is desirable for SubDataFrames. I'm imagining the need for an abstract type between DataFrames and SubDataFrames will come up soon and that `append!` will make sense for that, but I also imagine there will be other AbstractDataFrames like SubDataFrame.