Add endpoint for cancelling a build

- Adds a new BuildStatus: CANCELLED
- Adds an endpoint for changing the state of a build.  Currently only
the status can be changed and it can only be changed to CANCELLED.
- When a build is cancelled, we deplete any unstarted subjobs, then
call teardown on each slave.
- In the teardown call on a slave, wait for all executors to be idle
before posting idle status to the master.  This guards against a race
condition where a new build is submitted to the slave before all
executors are marked idle
- Client will cancel a build it has started if it is Ctrl-C'ed
I think there is a (very small) race condition here. If the last subjob legitimately finished between lines 225 and 226, then we'd block forever on line 226.

We might be safer with a try/except:
```python
while self._unstarted_subjobs is not None:
    try:
        self._unstarted_subjobs.get(block=False)
    except queue.Empty:
        break
```