allow SimpleSocketServer subclasses to reuse server startup logic

This change delegates the startup logic that was in main to doMain.
The doMain method takes a Class argument that identifies the
SimpleSocketServer subclass to create and run.