To make the enumeration objects immutable and thread-safe, use an associated object to keep the nested enumeration state.
This allows enumerations to run simultaneously across multiple dispatch queues.