Convert ReentrantCallback to CopyOnWriteArraySet

This fixes a ConcurrentModificationException that can be caused by
adding/removing listeners while iterating. This arose when the
ReentrantCallback code was modified to avoid using Guava and
UnmodifiableSet was incorrectly used as a replacement for ImmutableSet.
UnmodifiableSet allows the underlying collection to be modified which
leads to the exception if performed during iteration. This should be
faster as well and removes some custom code.