UniqSupply: Overhaul mkSplitUniqSupply

* The function is now split into two: the tiny part that is amenable to
  constant folding and should therefore be inlined, and the rest of the
  function that should not be considered for inlining.

* Rewrote the function to use do-notation.

* Instead of allocating one Unique per call to genSym, the function now
  preallocates 10 Uniques at a time, thereby reducing the amount of
  relatively expensive calls to genSym and noDuplicate# by a factor of
  10 or so. The drawback is that, on average, 5 Uniques will be
  discarded each time a UniqSupply is split.

TODO: Define an atomic add function in the RTS instead of using the
atomic compiler primitive.
TODO: Merge with previous commit.
TODO: Benchmark different step sizes and whether or not the tree should
be eagerly evaluated.