Implement Test stubs and some client restructuring

A pretty busy pull request:

* Implement stubs for `Test`, `TestCase`, and `TestCaseAnswer`.
* Split client into `models/` and `protocols/`. The goal is to make protocols `TestCase`-agnostic (i.e. independent of the type of `TestCase`).
* Create interfaces for `GradedTestCase` and `UnlockTestCase`
* Implement `PythonTestCase` and `ConceptTestCase`
* Reorganize `client/tests/`

Issues that will be left for a future pull request:

* Implementing the actual `Protocol` objects
* Unlocking still requires some thought (e.g. where to introduce the verification function). This goes along with implementing the `Protocol` object
* Grading still requires some thought (e.g. where to introduce the `frame` for code-based questions, where to introduce the `cache` for code-based questions).

Resolves #52 .
This if-else clause is a little hard to read. Maybe something like this:

self.suites = list(filter(lambda x: x, self.suites))

I think it's _slightly_ more obvious what it's doing, but hopefully you can find a better way?