[ActiveJob] TestCase

@dhh @rafaelfranca @cristianbica 
This feels like an awkward way to check whether a job was performed or enqueued. Is there a cleaner, simpler way?

For example, have the assertion put a watcher block on queue_adapter.enqueue. When queue_adapter.enqueue is called, it runs the watcher blocks. Then the assertion's block is called and it can check whether the enqueued job matches the one it's looking for:

In test adapter:
```ruby
def enqueue(job, *args)
  # ...
  enqueued_jobs << {job: job, args: args, queue: job.queue_name}
  call_watchers_for :enqueue
end

def call_watchers_for(method, job, args)
  watchers_for(:enqueue).each { |block| block.call job, *args }
end

def with_watcher(method, &block)
  watchers_for(method).push block
  yield
ensure
  watchers_for(method).delete block
end

def watchers_for(method)
  @watchers[method] ||= []
end
```
In test assertions:
```ruby
def assert_enqueued_job(args = {})
  enqueued = false
  @queue_adapter.with_watcher(:enqueue) do |job, *enqueue_args|
    enqueued ||= args.all?  { |key, value| value == job[key] }
  end
  assert enqueued
end
```