Scala STM Commit Barrier

A `CommitBarrier` allows multiple transactions on separate threads to perform a single atomic commit.  All of the actions performed by all of the atomic blocks executed by members of the barrier will appear to occur as a single atomic action, even though they are spread across multiple threads.

Commit barriers can be used to implement transactors, where actions taken by multiple actors should be atomic as a single unit.

Because there is no ordering possible between the atomic blocks that make up a commit barrier, if those transactions conflict then the only way to avoid deadlock is to roll back all of the barrier’s members.

If you observe a cancel cause of `CommitBarrier.MemberCycle` then this has happened to you, and you need to run more of the logic on a single thread inside a single transaction.

This abstraction is based on Multiverse’s `CountDownCommitBarrier`, by Peter Veentjer.