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)

There's a problem with Conversions.  Try and sort that as well.

scala> import geomesa.core.process.knn._
import geomesa.core.process.knn._

scala> KNNQuery.runNewKNNQuery(fs, q, 10, 1.0, 10.0, feat)
java.lang.ClassCastException: com.vividsolutions.jts.geom.LineString cannot be cast to com.vividsolutions.jts.geom.Point
	at geomesa.utils.geotools.Conversions$RichSimpleFeature$.point$extension(Conversions.scala:66)
	at geomesa.core.process.knn.GeoHashSpiral$.apply(GeoHashSpiral.scala:75)
	at geomesa.core.process.knn.KNNQuery$.runNewKNNQuery(KNNQuery.scala:48)