THRIFT-2641 Port FB Changes

I have been working on Thrift for Haskell at Facebook for the last few months and would like to merge my changes in to Apache Thrift. These changes have seen major usability and performance improvements, plus support for optional fields in Thrift Structs and 2 new protocols