Allow customization of response and result classes

This provides a hook to ultimately customize the result creation process. If someone really wanted access to the Response from each Result, they could do something like:

```
class CustomResult (Result):
    def __init__(self, doc, response):
        super(CustomResult, self).__init__(doc)
        self.response = response

    @property
    def percentile(self):
        return self._meta.score / self.response.hits.max_score

class CustomResponse (Response):
    def result_factory(self, doc):
        return CustomResult(doc, self)
```

And then either call `execute` with a `response_class`:

```
r = Search().execute(response_class=CustomResponse)
```

or specify the response class on the Search itself:

```
s = Search().response_class(CustomResponse)
```

But it would also allow for simpler customizations like overriding `__str__` or adding computed properties directly to results.
My use case for this is that I have a method that returns a `Search` instance already configured for an index/doc_type, and I'd like to program it with some custom Response/Result logic while still allowing calling code to customize the query. Having only the argument to `execute` would mean leaking all that logic to callers.