This module implements the Intel Concurrent Collections (CnC) programming model.
The variations of this module (Intel.Cnc3, Intel.Cnc5, Intel.Cnc6, and Intel.Cnc8)
each implement the same programming model using different runtime schedulers.
All of them internally use the IO monad but expose a pure interface.
(The module Intel.CncPure is an alternative implementation that
exposes the same interface as this module but is internally pure.)

CnC is a data-flow like deterministic parallel programming model.
To use it, one constructs a CnC graph of computation steps.
Steps are arbitrary Haskell functions (which may themselves expose
parallelism through par).
Edges in the graph are control and data relationships,
implemented by tag and item collections respectively.

Convert an entire item collection into an association list. In
general, this can only be done from the finalize step and
requires selecting a runtime scheduler which supports quiescence, that is,
a scheduler that waits for all active steps to complete before executing finalize.
(Currently, all schedulers but version 3 support quiescence.)

"cncFor start end body" runs body in parallel over the inclusive range [start..end].

Frequently, CnC graphs are serial within steps but parallel at the
level of the graph. In contrast, cncFor exposes parallelism
within a step. Whether the body of the parallel for is doing
work, or just spawning work via putt, cncFor can help
distribute the work more efficiently.