qmetaobject-rs safe connect

macro_rules! mconnect {
    ($sender:ident, $signal:ident, $slot:tt) => {
        fn internal_safe_connect<T: QObject + Sized, Args, F: Slot<Args> + FnMut() -> ()>(
            sender: &RefCell<T>,
            signal: &Signal<fn()>,
            slot: F,
        ) -> ConnectionHandle {
            let sender = unsafe { QObjectPinned::new(&sender).get_or_create_cpp_object() };

            unsafe {
                connect(sender, *signal, slot)
            }
        }

        let signal = $sender.borrow().$signal.to_cpp_representation(&*$sender.borrow());

        #[allow(unused_parens)]
        internal_safe_connect(&$sender, &signal, $slot);
    };
}