### Godot version

v4.1.1.stable.official [bd6af8e0e]

### System information

Godot v4.1.1.stable - Debian GNU/Linux trixie/sid trixie - Vulkan (Mobile) - dedicated NVIDIA GeForce GTX 1060 (nvidia) - Intel(R) Core(TM) i5-8400 CPU @ 2.80GHz (6 Threads)

### Issue description

:+1: For `Callable`s which have had `bind` *xor* `unbind` called on them, `Signal.is_connected` will return `true` so long as the base callable is the same.
:warning: For `Callable`s which have had `bind` *and* `unbind` called on them, `Signal.is_connected` seems to only return `true` for the exact `Callable` object.

I would expect `is_connected` to return `true` in the same manner for either case.

### Steps to reproduce

```gdscript
extends Node2D

signal boop(doot)
signal beep(doot)
signal baap(doot)

func _ready():
    boop.connect(translate.bind(Vector2.ZERO))
    print(boop.is_connected(translate)) # true
    print(boop.is_connected(translate.bind(Vector2.ZERO))) # true
    boop.disconnect(translate.bind(Vector2.ZERO))

    beep.connect(translate.unbind(1))
    print(beep.is_connected(translate)) # true
    print(beep.is_connected(translate.bind(Vector2.ZERO))) # true
    print(beep.is_connected(translate.unbind(1))) # true
    beep.disconnect(translate.unbind(1))

    var handler = translate.bind(Vector2.ZERO).unbind(1)
    baap.connect(handler)
    print(baap.is_connected(translate)) # false
    print(baap.is_connected(translate.bind(Vector2.ZERO))) # false
    print(baap.is_connected(translate.unbind(1))) # false
    print(baap.is_connected(translate.bind(Vector2.ZERO).unbind(1))) # false
    print(baap.is_connected(handler)) # true
    # Attempting this `disconnect` triggers "Attempt to disconnect a nonexistent connection..."
    baap.disconnect(translate.bind(Vector2.ZERO).unbind(1))
```

### Minimal reproduction project

Self-contained _scene_: [test.zip](https://github.com/godotengine/godot/files/12463837/test.zip)

return callable.get_bound_arguments_count() + binds.size();
}
void CallableCustomBind::get_bound_arguments(Vector<Variant> &r_arguments, int &r_argcount) const {
	Vector<Variant> sub_args;
	int sub_count;
	callable.get_bound_arguments_ref(sub_args, sub_count);
	if (sub_count == 0) {
		r_arguments = binds;
		r_argcount = binds.size();
		return;
	}
	int new_count = sub_count + binds.size();
	r_argcount = new_count;
	if (new_count <= 0) {
		
		r_arguments = Vector<Variant>();
		return;
	}
	r_arguments.resize(new_count);
	if (sub_count > 0) {
		for (int i = 0; i < sub_count; i++) {
			r_arguments.write[i] = sub_args[i];
		}
		for (int i = 0; i < binds.size(); i++) {
			r_arguments.write[i + sub_count] = binds[i];
		}
		r_argcount = new_count;
	} else {
		for (int i = 0; i < binds.size() + sub_count; i++) {
			r_arguments.write[i] = binds[i - sub_count];