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? :)
A function-based view is just a function. The method `as_view` on a class-based view returns a [callable](https://docs.djangoproject.com/en/dev/ref/class-based-views/base/#django.views.generic.base.View.as_view) (Which is usually a function, but wouldn't have to be). Neither of these is a method.