hadoopcompatibility: Implementations of basic programming interfaces and...

... a basic driver.

* wrappers for Mapper, Reducer and Combiner (as a local Reducer) on the new Java API
* wrapper for OutputCollector
* wrappers for Partitioner, values comparator.
* a driver making it posible to run unmonitored (so far)  Hadoop jobs on Flink.
* tests and variations of the WordCount driver exclusively in Hadoop.

You can find more about the Google Summer of Code project here:  https://issues.apache.org/jira/browse/FLINK-838?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14031511
The issue is that Flink uses the same key for partitioning and grouping, i.e., it would also partition on `keyOfGroup` and group on `partition`. Of course, partitioning and grouping are separate operations in the execution layer, but the API gives the same key for both to the optimizer.

If neither the partitioner or sorter are custom, MapReduce will also use the same key for both operations, i.e., behave the same way as Flink.

For this PR, I'd simply throw an exception if you encounter a user-defined partitioner or comparator and support only the default case. We need to think carefully how we can add support for custom partitioners and comparators and might need to extend the API or add a hook somewhere to enable that.