### Summary

When installing a collection artifact from a URL or tarball, with a mismatched `version`, an exception is raised, that should be handled and a better message provided to the user.

### Issue Type

Bug Report

### Component Name
```
lib/ansible/galaxy/collection/__init__.py
```
### Ansible Version

```console
$ ansible --version
2.11+
```


### Configuration

```console
$ ansible-config dump --only-changed
```


### OS / Environment

N/A

### Steps to Reproduce

<!--- Paste example playbooks or commands between quotes below -->
```shell
ansible-galaxy collection download -p . --no-deps sivel.toiletwater:==0.0.10
sed -i 's/version: 0.0.10/version: 0.0.9/' requirements.yml
ansible-galaxy collection install -p . -r requirements.yml -vvv
```


### Expected Results

Friendly error message

### Actual Results

```console
ERROR! Unexpected Exception, this is probably a bug: Provided candidate <sivel.toiletwater:0.0.10 of type 'file' from sivel-toiletwater-0.0.10.tar.gz> does not satisfy <sivel.toiletwater:0.0.9 of type 'file' from sivel-toiletwater-0.0.10.tar.gz>
the full traceback was:

Traceback (most recent call last):
  File "/Users/matt/projects/ansibledev/ansible/bin/ansible-galaxy", line 133, in <module>
    exit_code = cli.run()
  File "/Users/matt/projects/ansibledev/ansible/lib/ansible/cli/galaxy.py", line 552, in run
    return context.CLIARGS['func']()
  File "/Users/matt/projects/ansibledev/ansible/lib/ansible/cli/galaxy.py", line 75, in method_wrapper
    return wrapped_method(*args, **kwargs)
  File "/Users/matt/projects/ansibledev/ansible/lib/ansible/cli/galaxy.py", line 1186, in execute_install
    self._execute_install_collection(
  File "/Users/matt/projects/ansibledev/ansible/lib/ansible/cli/galaxy.py", line 1213, in _execute_install_collection
    install_collections(
  File "/Users/matt/projects/ansibledev/ansible/lib/ansible/galaxy/collection/__init__.py", line 512, in install_collections
    dependency_map = _resolve_depenency_map(
  File "/Users/matt/projects/ansibledev/ansible/lib/ansible/galaxy/collection/__init__.py", line 1329, in _resolve_depenency_map
    return collection_dep_resolver.resolve(
  File "/Users/matt/venvs/ansibledev/lib/python3.9/site-packages/resolvelib/resolvers.py", line 453, in resolve
    state = resolution.resolve(requirements, max_rounds=max_rounds)
  File "/Users/matt/venvs/ansibledev/lib/python3.9/site-packages/resolvelib/resolvers.py", line 347, in resolve
    failure_causes = self._attempt_to_pin_criterion(name, criterion)
  File "/Users/matt/venvs/ansibledev/lib/python3.9/site-packages/resolvelib/resolvers.py", line 221, in _attempt_to_pin_criterion
    raise InconsistentCandidate(candidate, criterion)
resolvelib.resolvers.InconsistentCandidate: Provided candidate <sivel.toiletwater:0.0.10 of type 'file' from sivel-toiletwater-0.0.10.tar.gz> does not satisfy <sivel.toiletwater:0.0.9 of type 'file' from sivel-toiletwater-0.0.10.tar.gz>
```


### Code of Conduct

- [X] I agree to follow the Ansible Code of Conduct
"""Install a collection from tarball under a given path.
    :param b_coll_targz_path: Collection tarball to be installed.
    :param b_collection_path: Collection dirs layout path.
    :param b_temp_path: Temporary dir path.
    """
    try:
        with tarfile.open(b_coll_targz_path, mode='r') as collection_tar:
            files_member_obj = collection_tar.getmember('FILES.json')
            with _tarfile_extract(collection_tar, files_member_obj) as (dummy, files_obj):
                files = json.loads(to_text(files_obj.read(), errors='surrogate_or_strict'))
            _extract_tar_file(collection_tar, MANIFEST_FILENAME, b_collection_path, b_temp_path)
            _extract_tar_file(collection_tar, 'FILES.json', b_collection_path, b_temp_path)
            for file_info in files['files']:
                file_name = file_info['name']
                if file_name == '.':
                    continue
                if file_info['ftype'] == 'file':
                    _extract_tar_file(collection_tar, file_name, b_collection_path, b_temp_path,
                                      expected_hash=file_info['chksum_sha256'])
                else:
                    _extract_tar_dir(collection_tar, file_name, b_collection_path)
    except Exception:
        
        shutil.rmtree(b_collection_path)
        b_namespace_path = os.path.dirname(b_collection_path)
        if not os.listdir(b_namespace_path):
            os.rmdir(b_namespace_path)
        raise
def install_src(