Factor out moving over loci to an iterator to allow for folds

I wanted to factor out moving over loci for a set of SlidingWindows.  Until now we had only performed a flatMap over loci in a window collecting results at each loci.  I wanted to do two things 1) Factor out the code to move loci by loci over a set of sliding windows and 2) Add some other operations as we move loci by loci, i.e. a fold so we can aggregate data about the reads in order.  I will add some tests for the fold, but wanted to get some feedback earlier on.

cc @timodonnell Might be worth checking out for you if you are looking to get back into guac things.
I think we need to better document the nested levels of iteration here and elsewhere in the code this commit is touching; for example, this says "Elements of type M" but in fact this is a `Seq` of `Iterator`s over elements of type `M`.

I still don't have a good mental model when I look at a `Seq[Iterator[M]]` of what each nested level of iteration represents, let alone the `SlidingWindowsIterator`, which extends `Iterator[Seq[SlidingWindow[Region]]]`; SlidingWindow is itself iterator-like, so `SlidingWindowsIterator` is like 3 levels of nested iterator where only one has a type that is at all self-descriptive (`SlidingWindow`).

Maybe some `type` aliases for commonly used compositions that make it clearer what the semantics are? Or some other hints I think are necessary.