### 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.

if (base_ref_counted && !ref_dying && owner && unsafe_referenced) {
		// T
		// T
		RefCounted *rc_owner = static_cast<RefCounted *>(owner);
		// We will unreference the owner before referencing it again, so we need to keep it alive
		Ref<RefCounted> scope_keep_owner_alive(rc_owner);
		(void)scope_keep_owner_alive;
		// Unreference the owner here, before the new "instance binding" references it.
		// Otherwise, the unsafe reference debug checks will incorrectly detect a bug.
		bool die = _unreference_owner_unsafe();
		CRASH_COND(die); // `
		void *data = CSharpLanguage::get_instance_binding(owner);
		CRASH_COND(data == nullptr);
		CSharpScriptBinding &script_binding = ((RBMap<Object *, CSharpScriptBinding>::Element *)data)->get();
		CRASH_COND(!script_binding.inited);
#ifdef DEBUG_ENABLED
		// The "instance binding" holds a reference so the refcount should be at least 2 before `scope_keep_owner_alive` goes out of scope
		CRASH_COND(rc_owner->get_reference_count() <= 1);
#endif
	}
	if (script.is_valid() && owner) {
		MutexLock lock(CSharpLanguage::get_singleton()->script_instances_mutex);
#ifdef DEBUG_ENABLED
		// CSharpInstance must not be created unless it's going to be added to the list for sure
		HashSet<Object *>::Iterator match = script->instances.find(owner);
		CRASH_COND(!match);
		script->instances.remove(match);
#else
		script->instances.erase(owner);
#endif