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`?
I think we should do this later, but I feel like caching should be hidden from the end user. Ideally, we'd be smart enough to see which lines can be cached and which ones need to be repeated.