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
Got it. Another option is to keep the AbstractDataFrame version but then give an error when it's called with a SubDataFrame:

```julia
save(filename::String, df::SubDataFrame) = error("`save` not implemented for SubDataFrames")
```