### Godot version

4.0.2

### System information

Windows 10 960m

### Issue description

When using the skeltonIK3d on a simple bone chain, the roll axis of bones are not working correctly. As can be seen in this clip comparing 3.5 to 4.0.2, when moving the ik target on the x axis, the bone roll of the shin bone twists in a very strange way.

When the ik target is just moving up and down on the y axis 4.0.2 looks the same as 3.5. I have tried many ways of setting the roll axis in blender before exporting, but this seems to make no difference in godot.

https://github.com/godotengine/godot/assets/7741669/524f9450-8582-4336-96a2-397ffe915d2d

@lyuma I also tried this with your recent fix in master and it does not fix this issue, unfortunately. I did try the scorpion demo scene and I can see that it resolved that. Simple 2 or 3 bone chains seem to exhibit this odd roll issue...maybe the long chain on the scorpion tail is covering up the issue?

On a side note, I am getting tons of crashes trying to test out simple ik with the standard tool script. Especially just clicking in the skeletonik3d node. 

### Steps to reproduce

- import a simple 2 or 3 bone skeleton such as a leg
- add a skeltonik3d node
- fill in the node parameters and add a marker3d as target
- add a tool script to start off the ik solve
- move the ik target on the x axis and observe the twisting

### Minimal reproduction project

This has the 3.5, 4.0.2 file and the blend file

[ik_roll_bug.zip](https://github.com/godotengine/godot/files/11521836/ik_roll_bug.zip)

if (blending_delta >= 0.99f) {
		
		p_task->end_effectors.write[0].goal_transform = p_inverse_transf * p_task->goal_global_transform;
	} else {
		
		const Transform3D end_effector_pose(p_task->skeleton->get_bone_global_pose_no_override(p_task->end_effectors[0].tip_bone));
		
		p_task->end_effectors.write[0].goal_transform = end_effector_pose.interpolate_with(p_inverse_transf * p_task->goal_global_transform, blending_delta);
	}
}
static Vector3 get_bone_axis_forward_vector(Skeleton3D *skeleton, int p_bone) {
	
	if (skeleton->get_bone_parent(p_bone) > 0) {
		return skeleton->get_bone_rest(p_bone).origin.normalized();
	}
	
	Vector<int> child_bones = skeleton->get_bone_children(p_bone);
	if (child_bones.size() == 0) {
		WARN_PRINT_ONCE("Cannot calculate forward direction for bone " + itos(p_bone));
		WARN_PRINT_ONCE("Assuming direction of (0, 1, 0) for bone");
		return Vector3(0, 1, 0);
	}
	Vector3 combined_child_dir = Vector3(0, 0, 0);
	for (int i = 0; i < child_bones.size(); i++) {
		combined_child_dir += skeleton->get_bone_rest(child_bones[i]).origin.normalized();
	}
	combined_child_dir = combined_child_dir / child_bones.size();
	return combined_child_dir.normalized();
}
void FabrikInverseKinematic::solve(Task *p_task, real_t blending_delta, bool override_tip_basis, bool p_use_magnet, const Vector3 &p_magnet_position) {