AsyncLINQ: refactoring to better handle composition of filters and transforms, added observers and initial implementation for sorting

- AsyncFilterExpression and AsyncTransformExpression help combine filters and selector that could be either sync or async.
- Fixed bug where in a foo.Select(...).Where(...) the Where could be evaluated before the Select
- Added .Observe((x) => { ...}) that can execute actions on each element of the sequence, but without changing the result
- Added the notion of QueryStatistics<T> that can be used to measure what flows through some part of the query
- Added TakeWhile(.., out QueryStatistics<bool> stopped), and other like WithCountStatistics(..) or WithSizeStatistics(...)
- Fixed most aggregate methods to call into FdbAsyncIterator<T>.ExecuteAsync(..) whenever possible, instead of calling MoveNext() manually.
- Added initial support for sorting (not complete)