[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. 


This is probably the way to write this entire function
```
scala> val x:Seq[Long]=List(1,2,3,8,9)
x: Seq[Long] = List(1, 2, 3, 8, 9)

scala> val first = for { i <- 0 to x.size -2
     |   curr = x(i)
     |   next = x(i+1)
     |   if (next > curr + 1)
     | } yield  curr
first: scala.collection.immutable.IndexedSeq[Long] = Vector(3)
```