[FIX] Rewritten signal handling

Both [worker] and [fetcher] can be killed using :INT and :TERM signals (for example using `kill` command from command line)
If [worker] is killed, kills all children, clean theirs pids in redis and `exit!`.
If [fetcher] is killed, clean its pid in redis and `exit!`, [worker] waits `HEARTBEAT` seconds and fork [fetcher] again

NOTE:

[:INT, :TERM].each do |signal|
  trap(signal) { exit }
end

in [fetcher] part throws `SystemExit` exception in concrete `JOB`. This `JOB` should handle this exception for clean `exit`.

for example if job definition looks like this:

def self.perform
  while true
    begin
      # do some stuff
    rescue Exception => e
      puts "something bad happened"
    end
  end
end

[worker] can't kill [fetcher], so `SystemExit` exception should be rescued:

def self.perform
  while true
    begin
      # do some stuff
    rescue SystemExit => e
      break
    rescue Exception => e
      puts "something bad happened"
    end
  end
end