fix(DB#setRingJPId): `jpId` may be `null`
refactor(*): ring-full rejection handled on server

Handle the rejection of a CJ's request to join a ring differently from
the removal of a CJ from a ring. With the former, the CJ is not yet
authorised and sees the authorisation view, whereas in the latter, the
CJ is already authorised and sees the ring view.
refactor(*): simplify CJ slot management

Rather than managing an array of slot objects client-side (JP), manage a
single integer server-side. On the client, store CJs in a simple array,
and use a template to display the slots in the sidebar. Also use a
template to display the judge scores in the match panel.
refactor(setCJAuthorised): call from Ring, not CJ
fix(setRing): call `new RingView()` only once

Move initialise of new RingView to JP Controller's constructor, and use
`setRing(ring)` to change the view's Ring model.
feat(DB#setRingSlotCount): update `slotCount` in DB
feat(*): review unauthorised actions

- Allow match to be started if not all CJ slots are taken or a CJ is
disconnected or unauthorised.
- Disallow removing a slot if there's only one or if all slots are
occupied.
- Allow CJ to join a ring while a match is in progress.
Merge pull request #22 from axelboc/refactor-slots

Refactor slots