Incorrect invalid device error introduced in #25956

### Describe the bug

#25956 introduced a new `sklearn.utils._array_api._check_device_cpu` function to test whether a tensor is on CPU. However, the implementation of the test, which is `device not in {"cpu", None}`, is incorrect -- the device will actually not be a string, but `device(type='cpu')`. Therefore, you should attempt to get the `type` attr, and use that if available.

### Steps/Code to Reproduce

You can view a sample error here:
https://github.com/fastai/fastai/actions/runs/9232979440/job/25404873935

### Expected Results

`ValueError: Unsupported device for NumPy: device(type='cpu')`  should not be thrown.

### Actual Results

```
File /opt/hostedtoolcache/Python/3.10.14/x64/lib/python3.10/site-packages/sklearn/utils/_array_api.py:308, in _check_device_cpu(device)
    306 def _check_device_cpu(device):  # noqa
    307     if device not in {"cpu", None}:
--> 308         raise ValueError(f"Unsupported device for NumPy: {device!r}")

ValueError: Unsupported device for NumPy: device(type='cpu')
```

### Versions

```shell
I've seen this on multiple Linux and Mac versions. My current Mac version:


System:
    python: 3.11.8 (main, Feb 26 2024, 15:36:12) [Clang 14.0.6 ]
executable: /Users/jhoward/miniconda3/bin/python
   machine: macOS-14.3.1-arm64-arm-64bit

Python dependencies:
      sklearn: 1.4.2
          pip: 23.3.1
   setuptools: 68.2.2
        numpy: 1.26.4
        scipy: 1.13.0
       Cython: None
       pandas: 2.2.1
   matplotlib: 3.8.4
       joblib: 1.4.0
threadpoolctl: 2.2.0

Built with OpenMP: True

threadpoolctl info:
       filepath: /Users/jhoward/miniconda3/lib/libopenblasp-r0.3.21.dylib
         prefix: libopenblas
       user_api: blas
   internal_api: openblas
        version: 0.3.21
    num_threads: 8
threading_layer: pthreads
   architecture: armv8

       filepath: /Users/jhoward/miniconda3/lib/libomp.dylib
         prefix: libomp
       user_api: openmp
   internal_api: openmp
        version: None
    num_threads: 8
```
```

COMMENT:
I tried to craft a minimal reproducer by mixing numpy and torch inputs as follows:

```python
>>> import numpy as np
>>> import array_api_compat.torch as xp
>>> import sklearn
>>> sklearn.set_config(array_api_dispatch=True)
>>> from sklearn.metrics import r2_score
>>> r2_score(xp.arange(10, device="mps"), xp.arange(10, device="mps"), sample_weight=xp.asarray(range(10), device="mps"))
1.0
>>> r2_score(np.arange(10), xp.arange(10, device="mps"), sample_weight=xp.arange(10, device="mps"))
Traceback (most recent call last):
  Cell In[16], line 1
    r2_score(np.arange(10), xp.arange(10, device="mps"), sample_weight=xp.arange(10, device="mps"))
  File ~/code/scikit-learn/sklearn/utils/_param_validation.py:213 in wrapper
    return func(*args, **kwargs)
  File ~/code/scikit-learn/sklearn/metrics/_regression.py:1214 in r2_score
    xp, _, device_ = get_namespace_and_device(
  File ~/code/scikit-learn/sklearn/utils/_array_api.py:572 in get_namespace_and_device
    *get_namespace(*array_list, **skip_remove_kwargs),
  File ~/code/scikit-learn/sklearn/utils/_array_api.py:553 in get_namespace
    namespace, is_array_api_compliant = array_api_compat.get_namespace(*arrays), True
  File ~/miniforge3/envs/dev/lib/python3.11/site-packages/array_api_compat/common/_helpers.py:372 in array_namespace
    raise TypeError(f"Multiple namespaces for array inputs: {namespaces}")
TypeError: Multiple namespaces for array inputs: {<module 'array_api_compat.numpy' from '/Users/ogrisel/miniforge3/envs/dev/lib/python3.11/site-packages/array_api_compat/numpy/__init__.py'>, <module 'array_api_compat.torch' from '/Users/ogrisel/miniforge3/envs/dev/lib/python3.11/site-packages/array_api_compat/torch/__init__.py'>}
```

but it's raising the expected error message that states that `r2_score` should not be called with mixed-type inputs (as of now, we might relax this in the future if we have a good reason to do so).

Labels: Bug, Regression, Array API