Websockets were unnecessary, as we only need 1-way communication.
Instead, we switched to server-sent events. But there are a couple of
problems:
1. We still can't stop the server while a websocket connection is open
2. SSE make it difficult to format messages
So this is not a big win for now...
FastAPI is mostly uvicorn+starlette. As such, the documentation is
spread over multiple places. Also, pydantic parsing of arguments is a
pain to work with. Since we don't need powerful performance, we switch
to Quart. Quart is preferred over Flask because of its async
capabilities, which we need for log streaming in websockets.
In progress: execute tutor commands and stream logs.