AsyncQueryBuilder fixes and immutable QueryBuilders

1. AsyncQueryBuilder was only using the q parameter of the query, discarding rows/sort/fields/etc - use Solr's ClientUtils.toQueryString
2. change AsyncQueryBuilder to POST the query instead of GET - allows large queries to be run
3. allow any SolrParams object to be used for querying instead of requiring a SolrQuery object
4. change QueryBuilderBase methods to return copies of the query builder instead of modifying the object. Besides immutability generally being good, this allows (for instance) a use case of taking in a partially built QueryBuilder and then easily send out copies to other threads to run queries with different start points / row counts / parameter maps