Camel: Add an asynchronous API.
Add pairs of asynchronous "dispatch" and "finish" methods for most
blocking "sync" methods in Camel's public API. All asynchronous methods
have default implementations that just call its synchronous counterpart
from a thread in GIO's thread pool (which is roughly equivalent to what
Evolution is doing from its own thread pool).
The possibility for Camel providers to implement an asynchronous
architecture by overriding the asynchronous methods exists, but first
requires some cleanup in the synchronous dispatching functions, many of
which are not "pure" in the sense that they do extra stuff before and
after calling the class method they wrap. That extra logic needs to
somehow run as part of the class method itself, either via chaining up
from subclasses or some other means.
In simpler terms, the following invariant must hold before providers can
override asynchronous methods and expect correct behavior from Camel:
Calling camel_foo_frobnicate_sync(foo) is equivalent to calling
CAMEL_FOO_GET_CLASS (foo)->frobnicate_sync (foo), just with fewer
runtime checks.