Cleanup client utils

I split up `utils.py` into different files and placed them in a `utils/` directory. I also cleaned some lint errors in other parts of the client.
Let's come up with a clear delineation between OkExceptions (exceptions that are sent back to the server) and "client exceptions" (exceptions that are shown to students). Are `OkException`s meant for errors with ok.py itself? What sort of exceptions would we want to send to the server that we wouldn't also want to show students, or vice versa?