[WIP] fix getNextAvailableAddress to use local maximums instead of just last a...

...ddress

@dallasmarlow @joshrabinowitz @Primer42 @maddalab Comments/reviews welcome. This intends to fix IP allocation when not using pools. Old behavior would just allocate the next address, regardless of if a lower address was free. It would fail to allocate if you had a range 0..20 and IPs 18,19,20 were in use :(

Ive tested this for edgecases, and believe it is working correctly. However, I would love comments. I have a sneaking suspicion I could do this slickly with a for comprehension, but it escapes me. 


So this comprehension doesnt cover the case where sortedAddresses.size<=2 (meaning the range is 0..0) when using ```Stream.range```, because it is not inclusive. Interestingly:

```
scala> Range(0,0)
res4: scala.collection.immutable.Range = Range()
scala> 0 to 0
res8: scala.collection.immutable.Range.Inclusive = Range(0)
scala> Stream.range(0,0)
res23: scala.collection.immutable.Stream[Int] = Stream()
```

I havent been able to find out how to make a Stream range be inclusive. Any ideas? This current iteration of code eats it after allocating the first address, because it thinks there are no localMaxima still :(