improved MockAppender to reduce timing sensitivity

The MockAppender now uses a BlockingQueue to hold appended events
until the test subject can pick them up using either awaitAppend or
getLastEvent.