GEOMESA-6, GEOMESA-198 Secondary Indexing

* Table layout consists of a catalog table to store metadata and three tables
  per simple feature type (spatiotemporal index, attribute index, record table)
* Queries consisting of only isEqualTo and LIKE with trailing wildcard are satisfied
  by the attribute index (an inverted text index)
* Backward compatibility is maintined with Old-style 0.10.x spatiotemporal index tables
  containing embedded simple feature type metadata
* The number of shards is now configurable per simple feature type
* SpatioTemporal Index, Attribute Index, and Record Tables are all presplit
* Bug fixed in imports in FeatureEncoder
* Implementing AttributeIndexFilteringIterator as a subclass of Filter
GEOMESA-176 Implement an 'explain' query feature.

Adds an 'explainQuery' feature.

As a rough example/guide try this in the Maven Scala console (i.e., run 'mvn scala:console -pl geomesa-core'):

import org.geotools.data._
import geomesa.core.filter.TestFilters._
import org.geotools.filter.text.ecql.ECQL

val aparams = Map(
"instanceId" -> "INSTANCE_ID",
"zookeepers" -> "ZOOKEEPERS",
"user" -> "USERNAME",
"password"-> new String("PASSWORD"),
"auths"-> "AUTHS",
"tableName"-> "TABLE_NAME",
"useMapReduce" -> "false")
val ds = DataStoreFinder.getDataStore(aparams)

val q = new Query()
val t = Transaction.AUTO_COMMIT

q.setTypeName("gdelt")

val afr = ds.getFeatureReader(q, t).asInstanceOf[AccumuloFeatureReader]
val is = afr.indexSchema

is.explainQuery(q)

val fs = "INTERSECTS(geom, POLYGON ((41 28, 42 28, 42 29, 41 29, 41 28)))"
val f = ECQL.toFilter(fs)
q.setFilter(f)

is.explainQuery(q)
GEOMESA-118 Implement handling for more complex geometric filter

* Pushes geometric ECQL filters into the STII/IndexIterator.
 This enables improved handling for other topological predicates along with conjunctions.