### 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
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
import os
import re
import pty
import time
import json
import signal
import subprocess
import sys
import termios
import traceback
from ansible import constants as C
from ansible.errors import AnsibleError, AnsibleParserError, AnsibleUndefinedVariable, AnsibleConnectionFailure, AnsibleActionFail, AnsibleActionSkip
from ansible.executor.task_result import TaskResult
from ansible.executor.module_common import get_action_args_with_defaults
from ansible.module_utils.parsing.convert_bool import boolean
from ansible.module_utils.six import iteritems, string_types, binary_type
from ansible.module_utils.six.moves import xrange
from ansible.module_utils._text import to_text, to_native
from ansible.module_utils.connection import write_to_file_descriptor
from ansible.playbook.conditional import Conditional
from ansible.playbook.task import Task
from ansible.plugins.loader import become_loader, cliconf_loader, connection_loader, httpapi_loader, netconf_loader, terminal_loader
from ansible.template import Templar
from ansible.utils.collection_loader import AnsibleCollectionConfig
from ansible.utils.listify import listify_lookup_plugin_terms