Functorialize over Lwt, Unix, Async

Async is not yet done, but will shortly
Split into several Findlib packages

- imap: main package, should be completely portable
- imap.unix: Unix (sync) backend
- imap.lwt: lwt backend
- imap.async: async backend (TO DO)
- imap.common: used by both impa.unix and imap.lwt
- imap.gsasl: use GNU SASL bindings
Add Async backend
Complete rewrite of the [Imap_io] system

This system is inspired by the one in Batteries.

BUGS:

- Imap_io.compress is not working.
Add CHANGES file
Add TODO file
Server/Client logger moved to [Imap_utils]
Simplify signature [IO.S]

Also, we rename

- [IO.ic] => [IO.input],
- [IO.oc] => [IO.output],
- [IO.read_into_exactly] => [IO.read_exactly]
  (the signature also changed in this one).
Cleanup: add licence
Changed [starttls], [compress] interface with [IO.S]
type safety: new modules [Uid], [Seq], ...

Introduced new modules [Uid], [Seq] (alias for [Uint32]), [Gmsgid],
[Gthrid], [Modseq] (alias for [Uint64]).  The aliasing takes place in
[Imap_uint_raw], which is not exported.  Hence for *users* of this
library they will appear as distinct types.  This makes it impossible to
use a uid when a sequence number is expected, etc.

Of course, internally no such safety exists because the module
[Imap_uint_raw] is visible.
Hide [Imap_types.response_info]

Also, get rid of the trivial alias [Imap_types.capability_info]
Fix [Imap_utils.log]
Get [Imap_io] out of core package

Since it is only used for the Unix backend, renamed in [Imap_gen_io] and
put it in [lib/unix].  Also, [IO.ml] renamed to [Imap_io.mli].
Merge [Imap_envelope], [Imap_body] in [Imap_mime]
Add to [Imap_io.S] interface

- [connect]
- [connect_ssl]
Simplify Async backend

Still not good enough, since it does not play well with Async's
monitor.  Will need to look more into this.
lwt: better [connect], [connect_ssl]
unix gen io: get rid of loggers
lwt: fix logging end of lines