Migrate unlocking feature from old autograder.

This pull requests implements the unlocking functionality from the old autograder. The `Protocol` is not yet implemented (I'll do this in a separate pull request).

Some code for the grading protocol has also been rewritten to be more consistent (including the introduction of an `OkConsole` abstract class).

This resolves #53 .
* For **grading** (i.e. stuff in `grading.py`): currently, WWPP `TestCase` grading (not unlocking) are handled by evaluating the `TestCase` as Python, given the student's code. The student is "correct" if the input satisfies an equality test (the exact equality test can be customized, but it defaults to `==`).

    We would need some way to avoid treating concept questions in the same way; i.e. avoid trying to evaluate concept questions (primarily written in English) as Python code. As such, it will always be necessary to treat concept questions as different from WWPP at some level (there is still room for generalization though).

* For **unlocking** (i.e. stuff in `unlock.py`): I currently have `code` and `concept` questions unlocked differently, but this should be easy to generalize. I see no problem in being "TestCase type"-agnostic here.