def add(socket, *data, &block)
      raise ArgumentError.new('Block must be supplied') unless block_given?
      raise ArgumentError.new('Block must allow at least one argument') if block.arity == 0
      if(block.arity > 0 && block.arity != (data.size + 1))
        raise ArgumentError.new('Invalid number of arguments for block')
      end
      @sockets[socket] ||= {}
      @sockets[socket][:procs] ||= []
      @sockets[socket][:procs] << [data, block]
      sync
    end
def add(socket, *data, &block)
      raise ArgumentError.new('Block must be supplied') unless block_given?
      raise ArgumentError.new('Block must allow at least one argument') if block.arity == 0
      if(block.arity > 0 && block.arity != (data.size + 1))
        raise ArgumentError.new('Invalid number of arguments for block')
      end
      @sockets[socket] ||= {}
      @sockets[socket][:procs] ||= []
      @sockets[socket][:procs] << [data, block]
      sync
    end
socket:: socket to listen to
 data:: data to be passed to block. NOTE: string from
 socket will be prepended to argument list
 block:: block to execute when activity is received
 Adds a socket to the list to listen to. When a string
 is received on the socket, it will send it to the block
 for processing