limit the number of threads used for collecting

this improves performance if there is a large number of
shards on a single node as it reduces context switching.

In a test run on a machine with 4 cores and 16 shards this
reduced the runtime of a group by from 0.33s per round to
0.24s
keep stacktrace on IndexShardMissingException
avoid string/bytesRef conversion in Id class
do not require pre-build hashes in BytesRefColumnReference
avoid boxing in IntegerColumnReference
use array for collectExpressions in GroupingProjector

iteration over array seems to require less allocations than
iteration over an arrayList (due to the iterator
allocations)

it is a minor improvement that seems hardly measurable.

probably also depends on jvm implementation?