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 .
I see your point with the filter. How about:

    suites = suites or []                                         
    self.suites = list(filter(lambda suite: suite != [], suites))