Sort out test runner entry points

_(Since we're focusing on other things this week, don't consider this PR important.)_

Allows tests to be executed through a test runner, semiauto.main.run, and from the shell using `python -m semiauto ARGS`, following the same patterns as unittest.

Previously tests were executed through calling main() when a new WebSocket connection was made from the browser client.  This is now delegated to semiauto.runner.

It also smooths over some of the rough edges by wrapping tornado.testing.gen_test and friends inside the semiauto library in case we need to change them in the future.