more fixes for issue #341

this patch uses a channel of response channels instead of slice of
response channels to create a pipeline instead of batches. In other
words before this patch we processed shardConcurrentLimit shards first,
then processed the next shardConcurrentLimit. With this patch we
constantly have shardConcurrentLimit in the pipeline, as soon as we're
done with one shard we start querying a new shard and so on. This
provides more parallelism and cleaner design.