Cleanup client

Resolves a bunch of issues- still need to test it though.

Resolves #292 #290 #293 (Theoretically...)
Moving this to `ok.py` would probably be better, but I'm fine with having it here. Submitting is an assignment-wide operation and should work independent of analytics.