Search Changes 2 - Refactor ElasticSearchResults class

This pull request does two things:
 - Splits ElasticSearchResults from ElasticSearchQuery.
 - Makes ElasticSearchResults behave like a Django QuerySet

ElasticSearchQuery is responsible for creating the Query JSON to send to ElasticSearch whereas ElasticSearchResults is responsible for managing the query and returned results.

ElasticSearchQuery is analogous to Djangos Query class and ElasticSearchResults is analogous to Djangos QuerySet class.

The main reason for this change is to make it easy to test generating queries without needing a connection to an instance of Elasticsearch.