server-spinach: pinging, registration, moves

This is essentially Basilica's sockets with a few tricks from my sleeve:

* Recursion with `runMaybeT . forever` instead of a tail call
* Exception handling -- `websockets` is insensibly terrible [1](https://github.com/jaspervdj/websockets/issues/48) [2](https://github.com/jaspervdj/websockets/issues/64) at handling exceptions, and the best way to work around it is to catch and finagle them ourselves
* Separation of models and state: I wanted `Player` and `Move` to be independent of the rest of the application, so `Connection` objects are directly stored in the `DB`. This allows for a slight simplification of the heartbeat, which becomes a fancy `filterM` 

Because GHCI doesn't fork to run main, you'll have to keep `kill $(lsof -i :9160 | tail -n 1 | tr -s ' ' | cut -d ' ' -s -f 2)`-ing in order to make it let go of the port. I recorded a little Emacs macro with `C-(` and `C-)` to do it for me, but I think it's easier to just have iTerm open and use `cabal run`.

I also had another tab open with `cabal repl` for `:load Client, cmain`.