Fixups of some DRY violations when parsing command line arguments

Hi,

This is something I've wanted to do for a while, but finally got around to while trying to understand how StageGroups work. I noticed that the logic for parsing command line arguments was duplicated and not clearly defined. This is an attempt to fix that. I also took the opportunity to extract some stuff from AbstractStage (which is becoming a bit big imho).

* Created StageCommandLineArguments class for parsing String[] args
* Moved logic for stage creation from AbstractStage into a StageFactory
* Other misc. refactoring + additional comments