* Overall code clean up: wrapped pipelineExecutor and clientExecutor in one
* bug fix: the server only launched executors if they were able to shut themselves down. However, the server should always launch the initial executors, regardless of whether they can die
* added keyboardinterrupt handler. Now when ctrl+c is provided to the server, this will be propagated to the executors.
* the client now explicitly unregisters with the server when shutting down or when it's killed.
* removed all semaphores and locks from the code; does not seem to be necessary
* in runStage in the pipeline_executor, replaced subprocess.call with subprocess.Popen. This was done in order to properly shutdown executors. The processes in the Pool (multiprocessing) turned out to be difficult to kill on a keyboard interrupt. To get around this, now all process IDs (pid) are stored in the executors. When a shut down call is made to the executor (through a caught keyboard interrupt), all processes currently running are killed through their pid.
* the server now keeps track of running stages. That way, the server can shut itself down when no stages are running, no stages are runnable and not all stages have finished. (this fixes #101)
* command line output of failed stages (this fixes #103)
Merge branch 'feedback-to-user-from-server' into develop
Merge branch 'develop' of github.com:mfriedel/pydpiper into develop