Add a TableReader trait and implementations for scanning tables stored in Hadoop, Tachyon, and Spark's block manager.

The TableReader implementations decouple most of the table scan execution paths from TableScanOperator. Pruning RDDs is still dependent on operator-specific executions, so that's still left in TableScanOperator.

The TableReaders also could be used for other purposes, such as implementing SharkLoadTask or TableToRDD.