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.
The other funny case here is the opposite, the consumer tries to collect all the windows - 
```scala
val i = SlidingWindowsIterator(_)
val s = i.toSeq
```

s is a sequence of `SlidingWindows` that are all the same as opposed to what should (I think) be there which is the windows oriented at each locus  Perhaps it does make sense then to produce and immutable version.  One downside there is create a small short-lived wrapper, but we can hope the GC manages it fine.