Do /metrics/find queries in parallel using threads

Based on what was done to fetchData() in #1026
prefetch cache: do a single http req per backend

This reduces the number of http calls done between the frontend and backends
by fetching all the requested targets in a single http request.

NOTE: both the backends and the frontend MUST run with this code.
The backend must return a new field: 'pathExpression' in its replies,
if it doesn't the current code will raise an exception.

It work as follows:
  - extract all the pathExpressions (metric name/patterns) from the targets
  - fetch all pathExpressions from all backends using a single http request
  - store the result in a properly keyed hash table:
      cache[backend][originalTarget-start-end] = [ series_from_backend]
  - Store that hash table in the requestContext
  - Continue processing as before (via evaluateTarget -> fetchData)
  - In the fetchData method do a hashtable lookup for the requested data.
      If the data is there use the cached data.
      If there is a cache miss, do a regular remote fetch.
    This last case is pretty rare, it happens when functions needs data out
    of the timerange of the original query.
    For example: timeshift, movingAverage, etc.
Merge pull request #1072 from datacratic/0.9.x-parallel_remote_find

Do /metrics/find queries in parallel
s/PREFETCH_REMOTE/REMOTE_PREFETCH/ + description

Renamed for consistency with other parameters.
Update REMOTE_PREFETCH_DATA description
Merge pull request #1073 from datacratic/0.9.x-prefetch-cache

Do a single http req per backend - and double the perf in some cases