Make Event thread-safe

Previously, Event had four non-volatile non-final fields.
Synchronization was not used consistently when reading/writing these
fields, leading to possible thread-safety and memory visibility
issues.

The replyTo and data fields have been declared volatile. This makes
their basic get and set methods thread-safe.

The id and headers fields are lazily initialized so declaring them as
volatile is insufficient. They are now protected by synchronizing on
a monitor object in both their get and set methods.

The Headers inner class was also not thread-safe. It would sometimes
use a ConcurrentHashMap, in which case it was thread-safe. It would
also sometimes use whatever map it was given, and therefore may
not have been thread-safe.

Headers has been updated to always use a ConcurrentHashMap to
hold its headers. It will also always copy any map that was used to
create the headers so that changes to the map will not affect the
contents of the Headers.

Fixes #93