Description
In Streams windowing operations we have several inherited classes from `Window`, as listed in the title of the ticket. They represent differences for:
1) Serialization of the window as part of the windowed key.
2) Window operations which is based on inclusive/exclusiveness of the window start/end.
As a result, we have resulted in lots of duplicated code to handle those different windows in windowed aggregations.
We can consider if it's worth serializing those window types differently (especially if we can get rid of the sequence id for time windows used for joins) and if we can just have a single class with booleans indicating inclusive/exclusiveness of the start/end, and hence as a result can largely reduce our code duplication around the serde and common window operations inside the stateful operator.