An adaptor is a component that runs within the Local Agent, producing chunks
of monitoring data.
An adaptor can, but need not, have an associated thread. If an adaptor lacks
a thread, it needs to arrange some mechanism to periodically get control and
send reports such as a callback somewhere.
Adaptors must be able to stop and resume without losing data, using a byte
offset in the stream.
If an adaptor crashes at byte offset n, and is restarted at byte offset k,
with k < n, it is allowed to send different values for bytes k through n the
second time around. However, the stream must still be parseable, assuming
that bytes 0-k come from the first run,and bytes k - n come from the second.
Note that Adaptor implements neither equals() nor hashCode(). It is never
safe to compare two adaptors with equals(). It is safe to use adaptors
as hash table keys, though two distinct Adaptors will appear as two distinct
keys. This is the desired behavior, since it means that messages intended
for one Adaptor will never be received by another, even across Adaptor