HPCC-9785 - Optimize the parallel and unsorted join helpers

The multi threaded join helpers were very inefficient in
processing the match/transform of groups and delivery the
results to the output.

The main 2 changes are:
1) Ensure each thread has it's own allocator, to avoid heavy
contention in the memory manager
2) Implement an efficient interface for multiple threads to
write to and a reader read from (a pipe with multiple writers).
This avoids heavy contetion and delays on mutexs and semaphores
that was being hit inside SimpleInterThreadQueueOf

Signed-off-by: Jake Smith <jake.smith@lexisnexis.com>
Changes folowing review and further testing

+ Add joinHelper_threads option
+ Add granularity, num threads and limit options
+ Correct a comment
+ Change when CThorSpillableRowArray::flush shuffles ptr array,
with behaviour here, it could cause the row array to keep growing
leaving lots of empty space behind it.
+ Fixed a couple of issue if aborting
+ add array appendRows method for efficiency and clarity
+ add a regression test joinmulti.ecl

Signed-off-by: Jake Smith <jake.smith@lexisnexis.com>
improve transferRowsCopy
Change a break; to a return; for clarity

Signed-off-by: Jake Smith <jake.smith@lexisnexis.com>
Merge pull request #4692 from jakesmith/hpcc-9785

HPCC-9785 - Optimize the parallel and unsorted join helpers

Reviewed-by: Gavin Halliday <ghalliday@hpccsystems.com>