Add support for computing custom file metadata while writing.

When using ParquetWriter metadata can be added using the map like putFileMetaData and putAllFileMetadata. When using ParquetOutputFormat a MetadataGenerator can be configured to compute the custom file metadata.

There are a couple of design decision that should probably be reviewed closely:
1. The implementation avoids exposing a map directly to users so that a check can be done to ensure protected metadata cannot be changed (e.g. the avro schema at the end of the file).

2. When using the map reduce framework file metadata is computed by registering a ParquetRecordWriter.MetadataGenerator class in the configuration with methods that are invoked on ParquetRecordWrtier.write() and ParquetRecordWriter.close().