Split up TestWindowFunctions

This makes it easier to find the tests for a given function and will be
necessary as we continue to add functions and tests.
Preserve ordering in window assertion output

Keeping the output in the same order as processed by the window
operator makes it easier to reason about and debug failures.
Make peer group range available to window functions

This is needed to implement logical window framing (RANGE).
Support using aggregate functions as window functions
Encapsulate access to window partition values

This introduces a new abstraction, WindowIndex, that is similar to
PagesIndex, but is read-only, and only has access to the rows within
the window partition (and thus hides the partition offset).
Extract method for analyzing expressions
Move window function tests together
Add basic validation of window frames
Add support for window frames
Optimize windowed aggregations