[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