Misleading error message for HDBSCAN exception

### Describe the bug

Before computing the minimum spanning tree, HDBSCAN checks if the number of connected components in the mutual-reachability graph is greater than 1. Here is the snippet - 
https://github.com/scikit-learn/scikit-learn/blob/55a65a2fa5653257225d7e184da3d0c00ff852b1/sklearn/cluster/_hdbscan/hdbscan.py#L110-L122

However, the connected components could be greater than 1 even if there are more than `min_samples` neighbours for all samples in the distance matrix. A similar [issue](https://github.com/scikit-learn-contrib/hdbscan/issues/82) was raised in the scikit-learn-contrib repo. The error message could be changed to indicate that the mutual-reachability graph might also be disconnected and hence the original distance matrix  (i.e. knn graph) in itself is disconnected, which does not work for HDBSCAN. 

### Steps/Code to Reproduce

```python
from sklearn.datasets import make_blobs
from sklearn.cluster import HDBSCAN
from sklearn.neighbors import NearestNeighbors
import scipy.sparse as sp

features, labels = make_blobs(n_samples=200, centers=2, n_features=2, random_state=42)
knn = NearestNeighbors(n_neighbors=10, metric='euclidean')
knn.fit(features)
knn_graph = knn.kneighbors_graph(mode='distance')

# Make distance matrix symmetric for HDBSCAN. Note: Distance values may not be correct here
# but it does not matter for the example
knn_graph = knn_graph + knn_graph.T

cc = sp.csgraph.connected_components(knn_graph, directed=False, return_labels=False)
print(f"Number of connected components of knn graph - {cc}") 
# Number of connected components of knn graph - 2


min_neighbours = 5
print(f"Samples with less than {min_neighbours} neighbours - {(knn_graph.getnnz(1) < min_neighbours).sum()}")
# Samples with less than 5 neighbours - 0

hdb = HDBSCAN(metric='precomputed')
hdb.fit(knn_graph)
# Leads to exception
```

### Expected Results

Exception with error message indicating the possibility of disconnected knn graph.

### Actual Results

```python
Traceback (most recent call last):
  File "/Users/ganesh/projects/data-centric-ai/cleanlab/example.py", line 56, in <module>
    hdb.fit(knn_graph)
  File "/Users/ganesh/projects/data-centric-ai/cleanlab_env/lib/python3.9/site-packages/sklearn/cluster/_hdbscan/hdbscan.py", line 819, in fit
    self._single_linkage_tree_ = mst_func(**kwargs)
  File "/Users/ganesh/projects/data-centric-ai/cleanlab_env/lib/python3.9/site-packages/sklearn/cluster/_hdbscan/hdbscan.py", line 253, in _hdbscan_brute
    min_spanning_tree = _brute_mst(mutual_reachability_, min_samples=min_samples)
  File "/Users/ganesh/projects/data-centric-ai/cleanlab_env/lib/python3.9/site-packages/sklearn/cluster/_hdbscan/hdbscan.py", line 116, in _brute_mst
    raise ValueError(
ValueError: There exists points with fewer than 5 neighbors. Ensure your distance matrix has non-zero values for at least `min_sample`=5 neighbors for each points (i.e. K-nn graph), or specify a `max_distance` in `metric_params` to use when distances are missing.
```

### Versions

```shell
System:
    python: 3.11.4 (main, Jun 15 2023, 07:52:47) [Clang 14.0.0 (clang-1400.0.29.202)]
executable: /Users/ganesh/projects/temp/bin/python3
   machine: macOS-13.5.2-arm64-arm-64bit

Python dependencies:
      sklearn: 1.3.0
          pip: 23.0.1
   setuptools: 67.6.1
        numpy: 1.26.0
        scipy: 1.11.2
       Cython: None
       pandas: None
   matplotlib: None
       joblib: 1.3.2
threadpoolctl: 3.2.0

Built with OpenMP: True

threadpoolctl info:
       user_api: openmp
   internal_api: openmp
    num_threads: 8
         prefix: libomp
       filepath: /Users/ganesh/projects/temp/lib/python3.11/site-packages/sklearn/.dylibs/libomp.dylib
        version: None

       user_api: blas
   internal_api: openblas
    num_threads: 8
         prefix: libopenblas
       filepath: /Users/ganesh/projects/temp/lib/python3.11/site-packages/numpy/.dylibs/libopenblas64_.0.dylib
        version: 0.3.23.dev
threading_layer: pthreads
   architecture: armv8

       user_api: blas
   internal_api: openblas
    num_threads: 8
         prefix: libopenblas
       filepath: /Users/ganesh/projects/temp/lib/python3.11/site-packages/scipy/.dylibs/libopenblas.0.dylib
        version: 0.3.21.dev
threading_layer: pthreads
   architecture: armv8

```

COMMENT:
Sure @glemaitre. 
Could you suggest if it is better to have separate checks for the two exceptions? 
First, we can check if any row in the CSR matrix has less than `min_samples` neighbours and if so, raise the existing exception. 

```python
if (mutual_reachability.getnnz(1) < min_neighbours).sum():
     raise ValueError( 
         f"There exists points with fewer ... ")
```
Note that this check could also be performed for the original distance matrix instead of the mutual reachability graph, avoiding additional computation. 

Then, we can check if the graph is connected or not and raise an appropriate exception.

Labels: Enhancement