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
At least `df2` could be defined for an AbstractDataFrame. Also, we could keep the first AbstractDataFrame argument and define the following:

```julia
Base.append!(adf1::SubDataFrame, adf2::AbstractDataFrame) = Base.append!(DataFrame(adf1), adf2)
```