Rewrite async implementation

Use int64 values instead of event channels themselves as the async_user
type in the Async functor. Store the event channels against the
corresponding int64 user ID in a hashtable.

The user ID will be incremented for each subsequent asynchronous call.

Signed-off-by: John Else <john.else@citrix.com>
Add logging

Signed-off-by: John Else <john.else@citrix.com>