New cached TFile reader implementation based on hadoop default impl

This method is the magic part that I add the cache. 
So TFile reader will create a new RBlockState every time when it tries to read a new block. By default the RBlockState is a lazy block reader which means it only creates a decompression stream from the beginning of the block to the end, It won't use this stream to read data until you call Scanner.getKeyValue(). 
Here we read the entire block data into memory when we instantiate the RBlockState object and cache it using block offset as a key. So everytime if you try to read entry from the same block that is accessed before, we will just read key value from the cached block data.