ClientSession can now automatically send NOOP commands as keepalives at a specified interval. Also, the CommandResponse decoders have been moved into their own directory (they will soon be fertile and multiply). More work ahead on the FetchResults object, which should be like NoopResults and completely encapsulate all the information returned from a FETCH.
Implemented a first stab at buffer management for IMAP literals. Added FETCH decoding of various RFC822 elements. Implemented a crude readmail program which will dump the full RFC822 message of any message in a mailbox.
Library now uses an extensible system for decoding the various structured data that FETCH returns. This system may be expanded later for decoding other CommandResponses (although FETCH is the command most in need of this). Also created an RFC822 directory for data structures and code to deal with mail messages and a common directory for code that is used throughout the library but doesn't belong to util as they're "core" classes.
Fleshed out the ClientSession state machine to follow the session state graph described by the IMAP specification. ClientSession is now firmly a single-connection object that tracks the server state appropriately. A higher-level class will need to be defined that manages multiple sessions (for when dealing with multiple folders, monitoring, etc.)
The input mode for Deserializer meant that the caller needed to manage the input stream and push data in an appropriate way; this is error-prone. Now Deserializer manages the input stream and the modes it must be read from. Serializer still works in a similar fashion as before, but now it deals with literal data more efficiently, writing it to the output stream directly (via splice_async()) rather than into the in-memory temporary buffer. Serializable's serialize() method is now async, meaning that all serialization can occur asynchronously, which is how we want it going forward.