### Godot version

4.0 beta 10

### System information

Windows 10, NVidia 2070, Vulkan Mobile

### Issue description

A human-sized (0.4 x 1.8 x 0.4) CapsuleShape3D on top of a large (50 x 50 x 50) SphereShape3D produces unstable normals when performing a move_and_collide down.

In discussions on the physics channel of the Godot Contributors Chat, the SAT solver isn't a good choice when the exact collision information can be solved analytically.

The problem with the SAT solver is that it ends up producing two collision points A and B on the two colliding shapes, and then the vector between them is used to build the normal. The problem is that A and B end up being extremely close (1e-4 distance), so normalizing the vector results in a large amplification of any numeric errors.

The current API for the ```_collision_<shape1>_<shape2>()``` functions can only report their findings via the ```_CollectorCallback``` API, and that only allows for providing the A and B points. Instead the collision functions should also have a means of providing exact analytic collision information if available.

### Steps to reproduce

Construct a scene consisting of a large 50m sphere with a capsule shape resting on top of it. Then perform a move_and_collide down and print the collision normal vector. 

### Minimal reproduction project

[SphereCapsuleCollision.zip](https://github.com/godotengine/godot/files/10306031/SphereCapsuleCollision.zip)

This demo walks a capsule around the top of a large sphere drawing the normal vector. The vector flickers between the correct normal and weird unstable normals:
![image](https://user-images.githubusercontent.com/1863707/209614550-5d631bb3-de05-463b-baf7-3c51b00b36e4.png)

(cnormal_a.x < 0) ? -box_A->get_half_extents().x : box_A->get_half_extents().x,
					(cnormal_a.y < 0) ? -box_A->get_half_extents().y : box_A->get_half_extents().y,
					(cnormal_a.z < 0) ? -box_A->get_half_extents().z : box_A->get_half_extents().z));
			Vector3 axis_ab = support_a - vtxb;
			if (!separator.test_axis(axis_ab.normalized())) {
				return;
			}
			
			for (int i = 0; i < 3; i++) {
				
				Vector3 axis_a = p_transform_a.basis.get_column(i);
				if (!separator.test_axis(axis_ab.cross(axis_a).cross(axis_a).normalized())) {
					return;
				}
			}
		}
		
		for (int i = 0; i < 2; i++) {
			for (int j = 0; j < 2; j++) {
				for (int k = 0; k < 2; k++) {
					Vector3 he = box_A->get_half_extents();
					he.x *= (i * 2 - 1);
					he.y *= (j * 2 - 1);
					he.z *= (k * 2 - 1);
					Vector3 point = p_transform_a.origin;
					for (int l = 0; l < 3; l++) {
						point += p_transform_a.basis.get_column(l) * he[l];
					}
					for (int e = 0; e < edge_count; e++) {
						Vector3 p1 = p_transform_b.xform(vertices[edges[e].vertex_a]);