Perform only one request from each equivalence class (not limited to one round).

The function cachedKeyTransform now gets another argument, a function
that selects a unique representative for any given equivalence class.
That representative is used as a key to cache results for requests
from that class.  This allows to perform only one request from a given
equivalence class.

Signed-off-by: Philipp Kant <philipp@infinipool.com>