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
Definitely right on `df2` -- will change.

Regarding that alternate definition of `append!`, I think if someone wanted that behaviour they'd use `vcat` and if they used `append!` they'd be rightfully confused to go back to `adf1` and see it unchanged, so I'd rather avoid that -- I understand that extending fewer functions to ADF makes it tougher to use the type you've added to DataFramesMeta, but I think there will be more AbstractDataFrames that are view-like, like SubDataFrame, and we should go ahead and add another abstract type under AbstractDataFrame that will cover DataFrame and CompositeDataFrame and would work for a distributed data frame as well.