use SearchNode.add() and add optimizer

* Replace more complicated subtree logic in SolrQuery.add_q with SearchNode.add
* Write basic query optizer to consolidate multiple filters or excludes into a
  where__in query when possible