introduced dataset abstraction
Added access to node descriptor from operator environment
objects can no longer span multiple buffers -> deadlock fix
added end of buffer msg when stream is finished
Exception when a query requires more execution units than available
Use a ConcurrentHashMap to manage tasks on TMs
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.
Physical Fold operator that folds all elements (not group-wise)
Pipelined GroupBy and Fold working on groups as well as elements

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
Partitioning with groups of elements

* put in group-end markers correctly when grouped data is partitioned
* don't use the partitioning function on every element and instead apply the function on the first
element and put all following elements in the same channel
(which assumes that partitioning is always done with the keys used for the grouping)
Physical Distinct operator
Operator tests via JUnit
DataflowNodeProperties without classes + scaled operator tests