Implements client-side test de/serialization

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`?