Search: Make database backend behave like Elasticsearch backend. Fixes #460

Previously the database backend returned a QuerySet which provides many features that the Elasticsearch backends SearchResults class doesn't have.

This pull request fixes this by making the database search backend return an object with the same API as the Elasticsearch backend to help make writing code that works on both backends easier.

It also makes the database backend also deconstruct the queryset that's passed to it. This is done to check that the developer is only using fields defined in ``search_fields`` and also makes sure they don't accidentally use any queryset features the search API doesn't support (such as aggregations for example).

The refactoring that was done to implement this pull request should make implementing new search backends much easier in the future as much of the logic is now shared across all the backends.
Should this be `raise NotImplemented`? If not, this will lead to strange errors like `TypeError: 'NotImplementedType' object is not iterable`. Same with `_do_count` below.