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 .
We should make a note to test whether or not this feature is actually useful. On one hand, I can see it being useful because the students are reminded of what the function is supposed to do. However, I can also see this as being un-necessary clutter when trying to debug. (The verbose flag should help with the clutter as well).