GEOMESA-93 Implement KNN as a WPS function

* Add a K-Nearest Neighbors Search that implements a GeoHash-by-GeoHash query strategy.
* Expose the KNN Search as a WPS process.
* Include an example KNN Search based on the location of the White House.
* Add a bounded PriorityQueue implementation.
* Add a method which, given a GeoHash, retrieves a list of all other GeoHashes in contact with it.
* Using the above method, implement a 'GeoHashSpiral' an Iterator that produces GeoHashes in order of distance from a point.


See https://github.com/locationtech/geomesa/pull/147 for prior review history and comments. 

Please note that server-side geodetic calculations and KNN ordering will be left to future tickets.

Some methods should be moved to other parts of GeoMesa (particularly the GeoHash tools)

scala> val bpq = new BoundedPriorityQueue[Int](10)
bpq: geomesa.core.process.knn.BoundedPriorityQueue[Int] = BoundedPriorityQueue()

scala> for(i <- 0 until 100) { bpq += i }

scala> bpq
res21: geomesa.core.process.knn.BoundedPriorityQueue[Int] = BoundedPriorityQueue(99, 90, 92, 95, 98, 93, 97, 91, 94, 96)

scala> bpq.iterator.toList
res22: List[Int] = List(99, 90, 92, 95, 98, 93, 97, 91, 94, 96)

scala> bpq
res23: geomesa.core.process.knn.BoundedPriorityQueue[Int] = BoundedPriorityQueue(99, 90, 92, 95, 98, 93, 97, 91, 94, 96)

scala> bpq.dequeue
res24: Int = 99

scala> bpq.dequeue
res25: Int = 98

Should 'iterator' be dequeue/consuming things?  Either way, I'd love the iterator to come back in order.