ensure releasing the lock when calling the user callbacks,

since if any of those blocks we don't want to block the entire mux.
Also having the mux locked make it interfere with other locks held by the caller
or accessed by the callback leading to dead locks
(for instance if the callbacks tries to retain a mutex while some other thread
 holds that mutex while trying to add a filedescriptor to the mux, this would lead
 to a dead lock since the mux is locked while executing the callback which blocks waiting
 for the mutex it wants to retain, but the other thread holding the mutex is blocked trying
 to add a filedescriptor to the locked iomux ... hence never releasing the mutex)

TODO: some internal cleanup is now necessary to avoid relying on 'tricky' assumptions