### Summary

This is a reopening of the issue https://github.com/ansible/ansible/issues/22737 which was said to be resolved by https://github.com/ansible/ansible/pull/70331. I reviewed the code and it appears that an attempt was made to resolve it but an error is being raised just before the new logic to use the delegated vars in the templar. When I ignore that error (by hacking task_executor.py), everything works as expected.

The task_executor.py:_execute method is setting context_validation_error when working with the play_context near the beginning of the method.

If I simply change the line:
```
        # if we ran into an error while setting up the PlayContext, raise it now
        if context_validation_error is not None:
            raise context_validation_error  # pylint: disable=raising-bad-type
```

to

```
        # if we ran into an error while setting up the PlayContext, raise it now
        if context_validation_error is not None and not self._task.delegate_to:
            raise context_validation_error  # pylint: disable=raising-bad-type
```

Then the templating with the delegated vars works as expected (I can have ansible_password: "{{ vault_ansible_password }}").

I'm not sure if this is the final solution you want, but it looks like an easy fix.

Note that the same fix does not work in Ansible 2.9. Is there any plan to backport 70331 to 2.9 (along with this fix?).

Thanks

### Issue Type

Bug Report

### Component Name

task_executor.py

### Ansible Version

```console
$ ansible --version
ansible [core 2.11.0]
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/home/REDACTED/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/lib/python3.8/site-packages/ansible
  ansible collection location = /home/REDACTED/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/local/bin/ansible
  python version = 3.8.3 (default, Aug 18 2020, 08:56:04) [GCC 8.3.1 20191121 (Red Hat 8.3.1-5)]
  jinja version = 2.11.3
  libyaml = True
```


### Configuration

```console
$ ansible-config dump --only-changed
<empty>
```


### OS / Environment

RHEL 8.2

### Steps to Reproduce

See 70331

### Expected Results

Ability to reference other variables inside connection variables.

### Actual Results

```console
Undefined error.
```


### Code of Conduct

- [X] I agree to follow the Ansible Code of Conduct
(self._task, tmp_task) = (tmp_task, self._task)
            (self._play_context, tmp_play_context) = (tmp_play_context, self._play_context)
            res = self._execute(variables=task_vars)
            task_fields = self._task.dump_attrs()
            (self._task, tmp_task) = (tmp_task, self._task)
            (self._play_context, tmp_play_context) = (tmp_play_context, self._play_context)
            
            no_log = no_log or tmp_task.no_log
            
            
            res[loop_var] = item
            res['ansible_loop_var'] = loop_var
            if index_var:
                res[index_var] = item_index
                res['ansible_index_var'] = index_var
            if extended:
                res['ansible_loop'] = task_vars['ansible_loop']
            res['_ansible_item_result'] = True
            res['_ansible_ignore_errors'] = task_fields.get('ignore_errors')
            
            try:
                res['_ansible_item_label'] = templar.template(label, cache=False)
            except AnsibleUndefinedVariable as e:
                res.update({
                    'failed': True,
                    'msg': 'Failed to template loop_control.label: %s' % to_text(e)
                })
            tr = TaskResult(