Implement Spy::Workers, retrieving Sidekiq Workers data.

This provides data equivalent to the `Sidekiq::Web` Workers page.

Since `Sidekiq::Workers` provides only an `#each` method utilising the
underlying Redis `SMEMBERS` command, random-access to workers data is
not provided. Even if it were, this would be counter-intuitive, as it
would be possible for a worker to appear twice in a fast-moving list (and
similarly woeful issues).

However, such random-access is not necessary; instead, hook `#refresh`
onto a `Display::Panel` refresh. Then `Display::Subpanel` can access data
as required. e.g., To list a maximum of 10 workers:

    @workers = SidekiqSpy::Spy::Workers.new
    (0...10).each do |i|
      puts "#{@workers.data.values[i][:name] rescue nil } : #{@workers.data.values[i][:queue] rescue nil }"
    end

There is no sort applied to the list, so it should reflect any underlying
order returned from Sidekiq.

(Where I'm using `rescue nil` to suppress errors with non-existent hash
keys; I hope this doesn't cause you to lose sleep.)
Define Display::Panels::Workers, equivalent to Workers page.

Using the data provided by `Spy::Workers`, define panel
`Display::Panels::Workers`. This displays a list of active Sidekiq
workers, along with their activities. Note that it is necessary to hook
into `#refresh` and call `Spy::Workers#refresh`. The list is defined to
be precisely as many table rows long as the panel minus the header row.

Mount a `:workers`  panel in `Display::Screen`, configuring to appear
under the `:header`, `:redis_stats`, `:sidekiq_stats` panels, filling
the remaining screen space.
Merge branch 'panel-workers'