I'm still cleaning up the patches and I need to rebase to current upstream (I think it's about 2 weeks behind at the moment), but I guess it should be okay for a general, high-level look.
I tried to take into account the comments from last round, in particular getting rid of the variable-size handle list returned by the server. For that I introduced a new server object `struct async_cancel` that gathers all the asyncs involved in the cancel and has its own sync object for waiting. I didn't use a plain async for that (as Jinoh previously mentioned) since there is no natural fd for it and it would need some special casing anyway (e.g. it probably shouldn't go into the process async list).
56deadb1 probably needs some splitting, as I mentioned in the commit message. I'll get to it shortly, likewise for rebasing to current upstream. On that matter, this is after acde7e3bdcdd5c5f44748dc0b9db624a8cbdf2bc but I only fixed it up for the `get_sync` method, I haven't really thought about the new sync object stuff yet.