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`?
Another stylistic note- we shouldn't hardcode the strings in this dictionary- what I mean is that we should have either a class with these names in them or a bunch of config variables.