Bug 65812: Speed up processing of huge sync token chunks

The template in bug 65812 produces a huge (400k+ tokens) chunk, which is
processed fully synchronously. This patch speeds up that case with a few
changes:

- AccumChain.push uses direct push as long as firstAccum is still active

- All token concatenation is replaced with the JSUtils.pushArray helper, which
  dynamically switches to regular push once the accumulator becomes large.
  This avoids making accumulation O(n^2).

- The tokenizer cuts up huge (>100k token) chunks into several smaller
  sub-chunks to make the processing in following transformations more
  efficient. This does not however fully achieve the desired effect of
  bounding the number of tokens in flight. For that we'd likely have to change
  the AsyncTTM interface to allow returning chunks early, without accumulating
  all sync tokens first.

Overall, parse time for the test case in bug 65812 comes down to around 4
minutes with this patch. Over 80% of that time is spent in GC. Part of that
might be caused by the high peak memory usage of 1.5G, which can likely be
improved by reducing the number of tokens in flight as discussed above.

Change-Id: I41cab22b78be4aed3a8eb706661b91a2c5641d52