[plinq] Make possible the rearrangement of query nodes

By returning the value of the current node, after being updated or not, it gives the possibility to the child to update it's parent value, which enable the possibility to, for example, merge 2 where conditions that are following each other.
[plinq] Merge Where query nodes that are following each other
[plinq] Add Apply method

This method is used to avoid the yield return + foreach machinery. Instead, if the source is an array, then for each node of the query :
 - we apply the parent node which return an array containing all the values that it would have return
 - then we apply the current node on this array
 - finally we return this array to the child node that requested it

If a node does not support this Apply method, then it returns null by default. This deactivate the use of this Apply methods for all the children nodes as well, and it fallback to foreach + yield return.