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.
starting to answer my own questions:

so, this `Iterator` always returns the same `Seq[SlidingWindow[Region]]`, but with each `SlidingWindow[Region]` having been mutated to advance it.

you mentioned that one wrinkle of this abstraction as it currently stands is that it would be possible for consumers of this iterator to advance any of the windows on their own, outside of the control of this iterator.

I agree that that contributes to the feeling of strangeness here; what about having an interface that exposes an "immutable" version of SlidingWindow? i.e. the same thing but with a couple of methods missing?