Equivalence classes on requests.

This commit introduces a new function dataFetchEquiv, that allows to
define equivalent requests and makes sure that for a given equivalence
class, at most one request will be performed in a given round (with the
equivalent requests of the same round yielding the same result).

The next step will be to also look in the cache for already performed
equivalent requests, so that at most one request from a given
equivalence class is performed (not just in one round).

Signed-off-by: Philipp Kant <philipp@infinipool.com>
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>
Merge branch 'kantp-equivalent-requests'