Deduplicate incoming Execute requests using the internal cache
Context
#378 (closed) describes a new cache in the Execution service mapping Action digests to jobIDs for cacheable incomplete jobs in the grid.
This cache will allow best-effort deduplication of incoming Execute requests without having the overheads of checking some central state storage (e.g. the way we currently check the database, or by making a request to the Operations service).
Task Description
In the Execution Service, detect when an execution can be deduplicated by consulting the in-memory cache added in #378 (closed) and publishing a "CreateOperation" message on the Operations exchange with a new Operation name and the existing JobID found in the cache.
Acceptance Criteria
This is done when an Execute request sent to the RabbitMQ-based BuildGrid which duplicates an existing in-flight request doesn't result in a new job being enqueued under normal circumstances.