### Godot version

v4.0.beta10.mono.official [d0398f62f]

### System information

Windows 11

### Issue description

I am experiencing a runtime crash in my game which logs the following error:

```
ERROR: FATAL: Condition "!match" is true.
   at: ~CSharpInstance (modules/mono/csharp_script.cpp:2015)
Fatal error. System.Runtime.InteropServices.SEHException (0x80004005): External component has thrown an exception.
   at Godot.NativeInterop.NativeFuncs.godotsharp_internal_refcounted_disposed(IntPtr, IntPtr, Godot.NativeInterop.godot)
   at Godot.Object.Dispose(Boolean)
   at Godot.Object.Finalize()
```
There is no other output alongside this error.

I am using several `RefCounted` objects throughout my game and the error seems to be related. I'm using `RefCounted` 
 primarily as a way to pass my own C# objects as signal arguments.

~~My project is fairly complex so I'm having a hard time isolating the issue. The crash doesn't happen immediately, but rather it usually happens after a minute or so of playing the game. It also seems quite inconsistent - sometimes I can play for several minutes before the crash. There's probably a very specific combination of events I need to identify in order to reproduce the issue consistently.~~

~~I know this report isn't super helpful but I've been trying to isolate the issue for the past several hours with no luck. I figured I'd log it for now and update with an MRP if/when I find out how to reproduce.~~

I've now uploaded an MRP below. I still haven't been able to identify the exact cause but I am hoping the MRP is stripped down enough to make debugging easier.

I have confirmed the crash happens in betas 8 and 9 as well.

### Steps to reproduce

Unknown

### Minimal reproduction project

[Crash MRP.zip](https://github.com/godotengine/godot/files/10304593/Crash.MRP.zip)

Run the MRP for ~30 seconds and observe the crash. Also, you can remove `WanderTravelDefinition` from the `EnemyFlyingOrbBullet` to observe that the crash no longer happens.

return p_object->has_instance_binding(get_singleton());
}
void CSharpLanguage::tie_native_managed_to_unmanaged(GCHandleIntPtr p_gchandle_intptr, Object *p_unmanaged, const StringName *p_native_name, bool p_ref_counted) {
	// This method should not fail
	CRASH_COND(!p_unmanaged);
	// All mono objects created from the managed world (e.g.: 'new Player()')
	// need to have a CSharpScript in order for their methods to be callable from the unmanaged side
	RefCounted *rc = Object::cast_to<RefCounted>(p_unmanaged);
	CRASH_COND(p_ref_counted != (bool)rc);
	MonoGCHandleData gchandle = MonoGCHandleData(p_gchandle_intptr,
			p_ref_counted ? gdmono::GCHandleType::WEAK_HANDLE : gdmono::GCHandleType::STRONG_HANDLE);
	// If it's just a wrapper Godot class and not a custom inheriting class, then attach a
	// script binding instead. One of the advantages of this is that if a script is attached
	// later and it's not a C# script, then the managed object won't have to be disposed.
	// Another reason for doing this is that this instance could outlive CSharpLanguage, which would
	// be problematic when using a script. See: https://github.com/godotengine/godot/issues/25621
	CSharpScriptBinding script_binding;
	script_binding.inited = true;
	script_binding.type_name = *p_native_name;
	script_binding.gchandle = gchandle;
	script_binding.owner = p_unmanaged;
	if (p_ref_counted) {
		// Unsafe refcount increment. The managed instance also counts as a reference.
		// This way if the unmanaged world has no references to our owner
		// but the managed instance is alive, the refcount will be 1 instead of 0.
		// S
		// May not me referenced yet, so we must use init_ref() instead of reference()
		if (rc->init_ref()) {
			CSharpLanguage::get_singleton()->post_unsafe_reference(rc);