Implement client-side test de/serialization DO NOT MERGE

Deserialization works recursively -- Test.deserialize will call the deserialize methods of subclasses of TestCase. This is done by checking the `'type'` field of the test case JSON and finding the correct TestCase subclass. @Some3141 , to do that, we talked about having a `config.py` file that provides a mapping of strings to TestCase classes -- was there a particular way you wanted to do this, aside from just `import config` in `ok.py`?
Sounds good. I'll create an enum for it.