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
My motivation was being able to define one `f(::AbstractDataFrame, ...)` method replacing methods that iterated over `df.columns` for `DataFrame`s without there being a performance regression there, an extra vector allocated for the `SubDataFrame` version, or the tuples and indexing that went along with using `eachcol`. I thought it improved the code overall, but I'm definitely open to better solutions.