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
I'm confused on `columns`. What you have above looks a lot like how `eachcol` is defined (but for AbstractDataFrames). For DataFrames, columns is defined just based on df.columns. Can we just use `eachcol`? Or, rename it to `columns`? This looks like something that should be covered by the AbstractDataFrames API..