No need to synchronise MoveNext because it only delegates to Next
Nack/1 and Nack/2 can simply delegate to Nack/3
Can use slighly less coarse-grained locking here

evt is a local variable and thus cannot possibly be shared
Ditto for Ack
Ack/0 can simply delegate to Ack/1
Avoid AlreadyClosedException where we can
Add timeout to this test
More fine-grained locking, extra a method that performs synchronised writes