Make partition-preserving job support joins on inconsistent schemas

When joining two paths, it's possible that there may be a type that appears in both schemas (i.e. same namespace and name). It's also possible that the schemas for this type may not match. It's not uncommon to share types across data sets. Backwards compatible changes are sometimes made to these shared types, such as adding a nullable field. Old data in this case can still be parsed with the new schema. But one path may be behind the other. This causes a problem with Hourglass because it constructs a union of the input schemas, as required by Avro since an input schema must be set for the job. Actually this should be a problem with any MapReduce job joining Avro data like this.

The solution provided here is to store a mapping from input path to schema in the job configuration and use the right schema when constructing the record reader.  A custom input format AvroMultipleInputsKeyInputFormat is created that checks this mapping in the configuration.  This replaces the usage of AvroKeyInputFormat, which only supports a single input schema per job.

[ci skip]