[FLINK-1237] Add support for custom partitioners
  - Functions: GroupReduce, Reduce, Aggregate on UnsortedGrouping, SortedGrouping,
               Join (Java API & Scala API)
  - Manual partition on DataSet (Java API & Scala API)
  - Distinct operations provide semantic properties for preservation of distinctified fields
  - Tests for pushown (or not pushdown) of custom partitionings and forced rebalancing
  - Tests for GlobalProperties matching of partitionings
  - Caching of generated requested data properties for unary operators

This closes #207