Basic implementations of Filter, FlatMap, and Difference
First implementation of GroupBy (returning collections)

this implementation of GroupBy assumes that the input is already sorted on the keys used
for the grouping. the query compiler will put such a corresponding Sort operator in front
of each GroupBy operator. the GroupBy operator then just looks at each element's keys and
whenever the keys change from the current group's keys a group is returned.
 Temporary workaround for buffers still being freed when the TASK_STATE_FINISHED arrives
TypeInformation for groups (for group-wise partitioning etc)
Physical Fold operator that folds all elements (not group-wise)
Revert "TypeInformation for groups (for group-wise partitioning)"

This reverts commit 504ad9cfcaae6afb269787f0d79ab19b8cfd74ac.

Rationale: we will transfer elements of a group pipelined (=element-wise)
and not as a single collection (=materialized at each operator).
partitioning will therefore also be done on a per-element basis.
Pipelined GroupBy and Fold working on groups as well as elements [HACK]

GroupBy now returns elements instead of collections, but returns null values
whenever a group is finished, which the OperatorDriver then translates into
GroupEndMarker tokens. these GroupEndMarkers need to be handled by subsequent
operators, e.g. fold returns aggregates group-wise when the input has been
grouped.

the implementation is rather hacky, but works for a basic example (and does
not materialize groups at any point).
Physical FlatMap that provides a group via an iterator to its UDF

the physical operator currently materializes each group before providing
it via the iterator to the UDF... :-/