Add support for knockouts

This patch adds scheduling and scoring support for the knockouts.
These matches are added to the existing match schedule list, but are
marked as knockout matches.  This allows all systems to treat them in
the same manner as league matches if they want.

Since the teams in a match in the knockouts depend on the matches that
came before, matches where the players are unknown are filled with
"???" instead of a real team name.  This means that things like the
match schedule will display "???" vs "???" etc with the correct match
time.  Once the players are known, these are filled out correctly.

So, initially, the knockout schedule will entirely consist of matches
of "???" playing three other "???" players.

Scores for the knockouts will be stored in the /knockouts directory of
the compstate repository in the same manner as the league matches.
(The match numbering continues.)

Knockout rounds are scheduled with a configurable time gap between
them.  This allows time for score entry.  The final round can have an
additional gap too, as that one is the most stressful for everyone.

This currently lacks two (non-critical) things:  (both coming soon)
 - Support for delays during the knockouts
 - A stable random shuffling situation
   (The teams are placed in random zones during the knockout
    scheduling.  Since this algorithm is run on multiple systems, etc,
    the random sorting needs to be stable across systems and python
    versions.  At the moment this implementation contains a 'random'
    implementation that doesn't actually do anything.)
Use UTC internally

Using UTC internally means the system will be able to cope if it runs
over a DST change, but also that the HTTP API will return an ISO8601
date in UTC rather than in local time, which causes the clients to have
to cope with the timezone themselves and wouldn't work if they are
working in a different timezone to the server anyway.

This change will need to be reflected in srcomp-http (switch to utcnow)
and in the compstate repo (the timezone should be specified in the dates
where they are not UTC, which, at the time of writing, is BST).
Check that the arena exists when looking up

This fixes a bug where a KeyError would be raised if an arena that was
used in the earlier matches but not in later ones was requested.
Restore PEP 8 organisation of imports.

Change-Id: I3d86349375c6247aab4dd56f8ef4224bea3c1a1e
Separate construction of KnockoutScheduler from MatchSchedule.

This makes it possible to interact with the latter on its own if
desired (such as in tests), and makes it much simpler to get most
of the tests working again. Provide a class method which can be
used in place of the constructor (with the same signature as it
had) and use this for the 'real' usage of the object.

Change-Id: I76bafcbb07d2d63437a42b928d3bcb9036f417d0
Restore access to the number of teams in the knockouts

This is needed for the display of the league status and other things.
I don't think that value that's there is quite right yet, but this
provides a better solution than none at all.

Change-Id: Ifd6b812a7f93cbc2ee3c664e017cba3cb4d720b3
Bump submodule to pick up timezone corrections.

Change-Id: I8fa4ca8ae00b1934750bbf7a4f151339f8dc8f2e
Replace literals with a constant.

This makes it easier to use this value outside this module with
confidence that it won't be changed in manner that breaks things.

Change-Id: If5fc3c25182baf6af399512cc972c8a16b4971d6