API Allow users to pass instances of `DistanceMetric` directly to `metric` keyword arguments

# Motivation

SIMD intrinsics can accelerate pairwise distance computation by a factors of ~2.5-3.5x for `float64` data, and ~5-6x for `float32` data (benchmarked by this gist: https://gist.github.com/Micky774/bd1b8394fdaa82b25dcdfc111835c19b).
<details> 
<summary>
Plots
</summary>

![01ef290e-2055-47c8-ae0f-3fa009c478ef](https://user-images.githubusercontent.com/34613774/236366585-29759ac2-e31c-49e9-a95b-ead4ddc05e69.png)
![373fb964-81cf-4550-9875-39e0d5de28bd](https://user-images.githubusercontent.com/34613774/236366588-98f068a9-54e9-408f-b0c7-58533b9f44a0.png)

</details>

These benefits translate effectively into computation-bound estimators, such as `KNeighborsRegressor` (based on https://github.com/scikit-learn/scikit-learn/pull/26267):

<details> 
<summary>
Plots
</summary>

![1d7664fd-870d-4a7a-8f1a-7f25a0029d9c](https://user-images.githubusercontent.com/34613774/236367317-9b05d175-22d8-4deb-be82-9d49c0241b7e.png)

![f9aa8ab6-2dd3-4b47-9e20-0a6ea4e17cc3](https://user-images.githubusercontent.com/34613774/236367325-d412c4ee-5283-41d7-b898-05632b4c3269.png)

</details>

# Alternatives Considered

As discussed in https://github.com/scikit-learn/scikit-learn/issues/26010 and https://github.com/Micky774/scikit-learn/pull/11, while there is a significant preference towards avoiding implementing SIMD-based solutions within scikit-learn at this time. I do believe that there is a reasonable way to maintain such work (at least up to `SSE3` instructions), however a better-accepted solution is to create a plug-in for `DistanceMetric` and offer the SIMD-accelerated implementations as an engine. While this is indeed a good solution in the long run, there is still much work needed to be done on the plug-in API (https://github.com/scikit-learn/scikit-learn/issues/22438). Working on a separate engine/plug-in for `DistanceMetric` while the API is still being solidified and https://github.com/scikit-learn/scikit-learn/pull/25535 is still unmerged is probably going to do more harm than good by adding one more moving part to the mix and slowing down the review process.

# Suggested Solution

Allow users to pass instances of `DistanceMetric` directly to `metric` keyword arguments. This is backwards compatible and doesn't require any significant new infrastructure (mainly small changes to validation and updated docs/tests). This enables third-party libraries to provide their own accelerated solutions immediately.

In practice, this involves changes mainly in the following: 

- [x] [`ArgKmin`](https://github.com/scikit-learn/scikit-learn/pull/26267)
- [ ] `RadiusNeighbors`
- [ ] `ArgKminClassMode`
- [ ] `pairwise_distances`
- [ ] `pairwise_distances_argmin`

This will allow us to enable the functionality in parts of the following estimators (non-exhaustive):
```
- NearestNeighbors
- KNeighborsRegressor
- KNeighborsClassifier
- RadiusNeighborsRegressor
- RadiusNeighborsClassifier
- DBSCAN
- OPTICS
- Isomap
- TSNE (self.method != "exact")
- KernelDensity
- AffinityPropagation
- Birch
- MeanShift
- NearestCentroid
```

Notes:

1. `pairwise_distanecs` can't actually use the `DistanceMetric` in its current state, _however_ once https://github.com/scikit-learn/scikit-learn/pull/25561 is completed, it can benefit from accelerated `DistanceMetric` options as well.
2. Currently `{KD, Ball}Tree` support passing `DistanceMetric` through the `metric` argument, however do not support `DistanceMetric32` (see: https://github.com/scikit-learn/scikit-learn/pull/25914)

# Implementation

I have a sample implementation of this for `KNeighborsRegressor`, which is achieved by enabling this functionality for `ArgKmin` along with updating parameter validation in `NeighborsBase`; please see https://github.com/scikit-learn/scikit-learn/pull/26267.

COMMENT:
I will be taking a look into this.

Labels: API