Extract Tachyon interface to allow pluggable off-heap storage clients

Right now Tachyon is hard-coded as our off-heap storage format of choice, but users may want to plug in their own faster-than-disk engine. This patch is almost entirely a refactoring of the Tachyon interface into an "OffHeapStorageClient" interface which hides some of the details of the Tachyon implementation from the Shark code.

The interface changes for users of Shark are as follows:
- The OffHeapStorageClient can be specified by setting the "shark.offheap.clientFactory" system property, before creating SharkContext. This is similar to how Spark registers Serializer factories.
- CacheType.TACHYON is deprecated in favor of OFFHEAP.
- We now support `CACHE <TableName> IN <CacheType>` syntax, where CacheType defaults to MEMORY if unspecified.