[BZ 1110462] Refactoring to fix invalid metrics queue

DelayQueue cannot be used with ThreadPoolExecutor. I learned that
ScheduleThreadPoolExecutor basically uses a delay queue, but it stores
RunnableScheduledFuture objects whereas I want to store InvalidMetric objects
in order to use its definition of equals() and hashCode(). I considered
extending ScheduledThreadPoolExecutor and using the hooks it provides to
decorate the tasks added to the queue. It was going to involve too much time,
effort, and testing; so, I instead decided to use a DelayQeueue independent of
the Executor's queue.