IntegrationTestCase needs to make more sense

The new `IntegrationTestCase` is somewhat complicated, and provides some substantial abstractions.  It also doesn't handle function-based views well in the slightest.  I've reflowed it a bit to make more sense, made it deal with requests more smoothly, and added understanding of function-based views.  And lots and lots of comments.

@meshy @Ian-Foote review please? :)
Maybe this should be a `property`. Something like:

```python
@property
def view(self):
    try:
        view = self._view
    except AttributeError:
        message = "This test must have a '_view' attribute."
    raise ImproperlyConfigured(message)

    try:
        return view.as_view()
    except AttributeError:
         return view
```