add the possibilty to send commands via the websocket

With this change it is now possible to pass a command using the gaffer socket:

    # get a gaffer socket
    socket = server.socket()
    config = ProcessConfig("dummy", cmd, args=args, cwd=wdir)

    # pass a command
    cmd = socket.send_command("load", config.to_dict(), start=False)

You can then get the command result after sometimes:

    if cmd.done():
        result = cmd.result()

or in an asynchronous manner:

    def cb(event, cmd):
        result = cmd.result()

    socket.subscribe("command_sucess", cb)

or before passing the commad you can also set a done callback:

    cmd.add_done_callback(callback)

Internnally this changes introduce a Controller class that is used to process
commands and send results to the commands. This commands can be used by the
plugins if you want to introduce a new protocol.