<!--- Verify first that your issue is not already reported on GitHub -->
<!--- Also test if the latest release and devel branch are affected too -->
<!--- Complete *all* sections as described, this form is processed automatically -->

##### SUMMARY
<!--- Explain the problem briefly below -->
`ansible.builtin.command` module does not return as expected when executable not found
##### ISSUE TYPE
- Bug Report

##### COMPONENT NAME
<!--- Write the short name of the module, plugin, task or feature below, use your best guess if unsure -->
command
##### ANSIBLE VERSION
<!--- Paste verbatim output from "ansible --version" between quotes -->
```paste below
ansible 2.9.4
  config file = /home/valkra/code/ansible-config/ansible.cfg
  configured module search path = ['/home/valkra/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /home/valkra/.local/lib/python3.6/site-packages/ansible
  executable location = /home/valkra/.local/bin/ansible
  python version = 3.6.9 (default, Oct  8 2020, 12:12:24) [GCC 8.4.0]
```

##### CONFIGURATION
<!--- Paste verbatim output from "ansible-config dump --only-changed" between quotes -->
```paste below
ANSIBLE_PIPELINING(/home/valkra/code/ansible-config/ansible.cfg) = True
ANSIBLE_SSH_ARGS(/home/valkra/code/ansible-config/ansible.cfg) = -o ControlMaster=auto -o ControlPersist=60s
ANSIBLE_SSH_RETRIES(/home/valkra/code/ansible-config/ansible.cfg) = 4
CACHE_PLUGIN(/home/valkra/code/ansible-config/ansible.cfg) = jsonfile
CACHE_PLUGIN_CONNECTION(/home/valkra/code/ansible-config/ansible.cfg) = $HOME/.ansible/
CACHE_PLUGIN_TIMEOUT(/home/valkra/code/ansible-config/ansible.cfg) = 36000
DEFAULT_ASK_VAULT_PASS(/home/valkra/code/ansible-config/ansible.cfg) = True
DEFAULT_BECOME(/home/valkra/code/ansible-config/ansible.cfg) = True
DEFAULT_BECOME_ASK_PASS(/home/valkra/code/ansible-config/ansible.cfg) = False
DEFAULT_FORKS(/home/valkra/code/ansible-config/ansible.cfg) = 50
DEFAULT_GATHERING(/home/valkra/code/ansible-config/ansible.cfg) = smart
DEFAULT_HOST_LIST(/home/valkra/code/ansible-config/ansible.cfg) = ['/home/valkra/code/ansible-config/hosts']
DEFAULT_NO_TARGET_SYSLOG(/home/valkra/code/ansible-config/ansible.cfg) = True
DEFAULT_STDOUT_CALLBACK(/home/valkra/code/ansible-config/ansible.cfg) = debug
DEFAULT_TIMEOUT(/home/valkra/code/ansible-config/ansible.cfg) = 60
HOST_KEY_CHECKING(/home/valkra/code/ansible-config/ansible.cfg) = False
RETRY_FILES_ENABLED(/home/valkra/code/ansible-config/ansible.cfg) = False
```

##### OS / ENVIRONMENT
<!--- Provide all relevant information below, e.g. target OS versions, network device firmware, etc. -->
running locally (controller = target host) on ubuntu xenial. output of `uname -a`:
```
Linux kube-gollum 4.15.0-126-generic #129-Ubuntu SMP Mon Nov 23 18:53:38 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
```

##### STEPS TO REPRODUCE
<!--- Describe exactly how to reproduce the problem, using a minimal test-case -->
Just running the following playbook should illustrate the problem:
<!--- Paste example playbooks or commands between quotes below -->
```yaml
- hosts: localhost
  tasks:
    - command: lecho hi
      register: result
      changed_when: "'hi' in result.stdout"
```

<!--- HINT: You can paste gist.github.com links for larger files -->

##### EXPECTED RESULTS
<!--- Describe what you expected to happen when running the steps above -->
I would expect to get a message about the executable `lecho` not being found, like one gets when replacing `command` with `shell` in the above playbook:

```
PLAY [localhost] ******************************************************************************************************************************************************************************

TASK [shell] **********************************************************************************************************************************************************************************
fatal: [localhost]: FAILED! => {
    "changed": false,
    "cmd": "lecho hi",
    "delta": "0:00:00.002938",
    "end": "2020-12-17 10:15:29.944289",
    "rc": 127,
    "start": "2020-12-17 10:15:29.941351"
}

STDERR:

/bin/sh: 1: lecho: not found


MSG:

non-zero return code


PLAY RECAP ************************************************************************************************************************************************************************************
localhost                  : ok=0    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0
```

or if one drops the `changed_when` condition that tries to evaluate the registered result, one also gets a more meaningful message even with `command`:

```
PLAY [localhost] ******************************************************************************************************************************************************************************

TASK [command] ********************************************************************************************************************************************************************************
fatal: [localhost]: FAILED! => {
    "changed": false,
    "cmd": "lecho hi",
    "rc": 2
}

MSG:

[Errno 2] No such file or directory: b'lecho': b'lecho'


PLAY RECAP ************************************************************************************************************************************************************************************
localhost                  : ok=0    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0
```

##### ACTUAL RESULTS
<!--- Describe what actually happened. If possible run with extra verbosity (-vvvv) -->
I get a confusing error message with tries to tell me that my result var is not defined, even though there should always (?!) be a return value:
```
PLAY [localhost] ******************************************************************************************************************************************************************************

TASK [command] ********************************************************************************************************************************************************************************
fatal: [localhost]: FAILED! => {}

MSG:

The conditional check ''hi' in result.stdout' failed. The error was: error while evaluating conditional ('hi' in result.stdout): Unable to look up a name or access an attribute in template st
ring ({% if 'hi' in result.stdout %} True {% else %} False {% endif %}).
Make sure your variable name does not contain invalid characters like '-': argument of type 'AnsibleUndefined' is not iterable


PLAY RECAP ************************************************************************************************************************************************************************************
localhost                  : ok=0    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0
```

Playing with command with and without the conditional statement, it seems like the whole task fails when we try to evaluate the result, and we consequently don't get a result, while running the same task without the conditional that tries to evaluate the result does produce a result which can for example be inspected using a `block`-`rescue` debug construction... very strange. I suspect this is indeed a bug, and not a feature. 
if param is None:
            param = self.params
        return count_terms(check, param)
    def _check_mutually_exclusive(self, spec, param=None):
        if param is None:
            param = self.params
        try:
            check_mutually_exclusive(spec, param)
        except TypeError as e:
            msg = to_native(e)
            if self._options_context:
                msg += " found in %s" % " -> ".join(self._options_context)
            self.fail_json(msg=msg)
    def _check_required_one_of(self, spec, param=None):
        if spec is None:
            return
        if param is None:
            param = self.params
        try:
            check_required_one_of(spec, param)
        except TypeError as e:
            msg = to_native(e)
            if self._options_context:
                msg += " found in %s" % " -> ".join(self._options_context)
            self.fail_json(msg=msg)
    def _check_required_together(self, spec, param=None):