#306 Addresses issues with the AsyncAppender by re-implementing the underlying components

We now queue events using an internal ArrayBlockingQueue and inform subclasses of the AbstractSingleWriterAppender when that happens. The default implementation AsyncAppender now uses the single thread of the superclass to do the appending.

Added an additional implementation called DurableAsyncAppender based on the Java Chronicle. Before queueing an event internally, it logs that event to a Chronicle that will persist if the logging system isn't cleanly shut down. When the appender is restarted, it will iterate through any records in that Chronicle and re-process them through its delegate appenders. This might lead to duplicate log entries but the important thing is that no log events will be lost since everything gets persisted to the Chronicle before being queued to be written to a file, inserted into a database, or what have you.