PARQUET-79: add a streaming Thrift API, to enable processing the metadata as we read it and skipping unnecessary fields.

This pull request provides an API to read thrift in a streaming fashion.
This enables ignoring fields that are not needed without loading them into memory.
It also aloow treating the data as it comes instead of when it's fully loaded in memory.
We can make TypedConsumer generic
and the add method could be of generic type T and is defined in the super class which is TypedConsumer:
``` abstract class TypedConsumer<T> {
   abstract public void consume(T value)
}
```
advantage of this is removing the duplication of addXXX declaration for each XXConsumer

also after adding the Generic, the this.addXXX call can also be lifted to the super class. And each subclass only needs to define the T getValue method. The simplifies the code of TypedConsumer to only focus on 2 things:
1. get the value from protocol
2. call the consume method

So the code change would be:
``` abstract public static class TypedConsumer<T> {
final public void read(TProtocol protocol, EventBasedThriftReader reader) {
  this.consume(getValue(protocol))
} 

abstract public T getValue(TProtocol p) //This method should be implemented in concreate TypedConsumer
}