### 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 _less_func;
}
bool CallableCustomUnbind::is_valid() const {
	return callable.is_valid();
}
StringName CallableCustomUnbind::get_method() const {
	return callable.get_method();
}
ObjectID CallableCustomUnbind::get_object() const {
	return callable.get_object_id();
}
const Callable *CallableCustomUnbind::get_base_comparator() const {
	return &callable;
}
int CallableCustomUnbind::get_bound_arguments_count() const {
	return callable.get_bound_arguments_count() - argcount;
}
void CallableCustomUnbind::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);
	r_argcount = sub_args.size() - argcount;
	if (argcount >= sub_args.size()) {
		r_arguments = Vector<Variant>();
	} else {
		sub_args.resize(sub_args.size() - argcount);
		r_arguments = sub_args;
	}
}
void CallableCustomUnbind::call(const Variant **p_arguments, int p_argcount, Variant &r_return_value, Callable::CallError &r_call_error) const {