### Godot version

4.2 247c354

### System information

Windows 10.0.19045 - Vulkan (Forward+) - dedicated NVIDIA GeForce GTX 1060 (NVIDIA; 30.0.15.1403) - Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz (8 Threads)

### Issue description

#75778 exposed `_validate_property()` to scripting. It's implemented in GDScript and C#, but not GDExtension (depends on #78634).
https://github.com/godotengine/godot/blob/247c3548d810136ffe9c1694cd76db3236efaa90/core/object/script_language_extension.h#L685-L687

Relevant discussion: https://github.com/godotengine/godot/pull/75778#discussion_r1307294940

### Steps to reproduce

1. Add GDExtension script
2. Use `_validate_property()`

### Minimal reproduction project

N/A
et_comment_delimiters)
	virtual void get_comment_delimiters(List<String> *p_words) const override {
		Vector<String> ret;
		GDVIRTUAL_REQUIRED_CALL(_get_comment_delimiters, ret);
		for (int i = 0; i < ret.size(); i++) {
			p_words->push_back(ret[i]);
		}
	}
	GDVIRTUAL0RC(Vector<String>, _get_string_delimiters)
	virtual void get_string_delimiters(List<String> *p_words) const override {
		Vector<String> ret;
		GDVIRTUAL_REQUIRED_CALL(_get_string_delimiters, ret);
		for (int i = 0; i < ret.size(); i++) {
			p_words->push_back(ret[i]);
		}
	}
	EXBIND3RC(Ref<Script>, make_template, const String &, const String &, const String &)
	GDVIRTUAL1RC(TypedArray<Dictionary>, _get_built_in_templates, StringName)
	virtual Vector<ScriptTemplate> get_built_in_templates(StringName p_object) override {
		TypedArray<Dictionary> ret;
		GDVIRTUAL_REQUIRED_CALL(_get_built_in_templates, p_object, ret);
		Vector<ScriptTemplate> stret;
		for (int i = 0; i < ret.size(); i++) {
			Dictionary d = ret[i];
			ScriptTemplate st;
			ERR_CONTINUE(!d.has("inherit"));
			st.inherit = d["inherit"];
			ERR_CONTINUE(!d.has("name"));
			st.name = d["name"];
			ERR_CONTINUE(!d.has("description"));
			st.description = d["description"];
			ERR_CONTINUE(!d.has("content"));
			st.content = d["content"];
			ERR_CONTINUE(!d.has("id"));
			st.id = d["id"];
			ERR_CONTINUE(!d.has("origin"));
			st.origin = TemplateLocation(int(d["origin"]));
			stret.push_back(st);
		}
		return stret;
	}
	EXBIND0R(bool, is_using_templates)
	GDVIRTUAL6RC(Dictionary, _validate, const String &, const String &, bool, bool, bool, bool)
	virtual bool validate(const String &p_script, const String &p_path = "", List<String> *r_functions = nullptr, List<ScriptError> *r_errors = nullptr, List<Warning> *r_warnings = nullptr, HashSet<int> *r_safe_lines = nullptr) const override {
		Dictionary ret;
		GDVIRTUAL_REQUIRED_CALL(_validate, p_script, p_path, r_functions != nullptr, r_errors != nullptr, r_warnings != nullptr, r_safe_lines != nullptr, 