Add test coverage command

NOTE: This currently only works on Python 3, for
reasons yet unknown.
* Add coverage 3.7.1 to the requirements file.
* Add a coverage target to the makefile, and a
  .coveragerc configuration file.
* Make Git ignore any .coverage files output
  by this.
Fix annoying typo.

* The Pedantry Brigade rides again!
Improve the existing tests (so they actually work)

* Previously, the two existing tests were the same thing.
  Fix this.
* The PROTECTED_URLS and EXEMPT_URLS need to be moved
  into the method that configures settings in run.py,
  rather than living in their own, largely-ignored file.
* Switch off the sending of messages for testing
  purposes. It means we won't cover line 66 of
  login_required.py, but it also means we don't get
  horrible explosive errors about not having the message
  middleware installed/in use.
Add test for non-exempt, non-protected URLs.
Add test for non-GET requests

* Check that we get a 403 result.
Add test for 'pass' case on LoginRequiredMiddleware.
Coding style fixes.
Small refactoring for future clarity.

* Move Request class into the test class that needs it
  and rename it to DummyRequest. This allows me to do the
  same thing for another test class and load the request
  with different data.
* Remove an unnecessary environment setting.
Add skeleton of TestBasicAuthMiddleware

* Fill in the names of all the tests and add helper
  methods.
* Clean up some dodgy imports/installed apps to avoid
  errors and tidy up the code.
* Change HTTPResponse(mimetype='text/plain') to use
  content_type instead of mimetype due to a deprecation
  warning.
Add test for basic_challenge() method.
Add environmental settings for basic authentication.
Add tests for basic_authenticate() and fix base64

* Add tests for the success branch and two different failure
  branches of basic_authenticate().
* It transpires that .encode('base64') doesn't work in Python
  3, so (after much grief) replace that with a method capable
  of encoding and decoding base64 in both Python 2 and 3.
Implement test_lack_of_www_authentication

* The test also requires some added complexities in
  TestBasicAuthMiddleware.DummyRequest.
* There's another test that will be necessary.
Add test_no_http_auth_in_meta special case test.
Fill in the rest of the BasicAuth tests.
Add (skeletal) files to hold the rest of the tests.
Add test for CrispyPasswordResetForm

* The test asserts the number of children of each non-leaf
  node in the tree of layout objects, then the type and
  contents of each leaf.
Add skeleton file for TestURLs.
Add lots of URL tests.

* The URLsMixin from incuna_test_utils/testcases/urls.py
  isn't quite doing what we want here, so rip it off and
  make a small modification (resolve(...).func.cls ->
  resolve(...).func).
* Add lots of tests for the django.contrib.auth views
  that we're using (the others are more complex).
Add test for SSO login page.

* This url uses a RedirectView.as_view() call.  Because
  the test need to make the same call, the second
  assertEqual call in URLsMixin fails, as it tries to
  compare two pointers to RedirectView objects. For this
  reason, change the assertion to compare the objects'
  names rather than the objects themselves.