Use the right types for the GdkSurface::event arguments
We pass the GdkEvent as a pointer, because the autogenerated marshallers don't know how to handle GTypeInstance-derived classes.
Since the GValue box that we use in the marshaller passes the GdkEvent instance as is, we also need to acquire a reference before invoking the closure, and release it afterwards, to ensure that the GdkEvent instance survices the invocation.