<!--- 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. 
the same directory can also be found
        :kw cwd: If given, working directory to run the command inside
        :kw use_unsafe_shell: See `args` parameter.  Default False
        :kw prompt_regex: Regex string (not a compiled regex) which can be
            used to detect prompts in the stdout which would otherwise cause
            the execution to hang (especially if no input data is specified)
        :kw environ_update: dictionary to *update* os.environ with
        :kw umask: Umask to be used when running the command. Default None
        :kw encoding: Since we return native strings, on python3 we need to
            know the encoding to use to transform from bytes to text.  If you
            want to always get bytes back, use encoding=None.  The default is
            "utf-8".  This does not affect transformation of strings given as
            args.
        :kw errors: Since we return native strings, on python3 we need to
            transform stdout and stderr from bytes to text.  If the bytes are
            undecodable in the ``encoding`` specified, then use this error
            handler to deal with them.  The default is ``surrogate_or_strict``
            which means that the bytes will be decoded using the
            surrogateescape error handler if available (available on all
            python3 versions we support) otherwise a UnicodeError traceback
            will be raised.  This does not affect transformations of strings
            given as args.
        :kw expand_user_and_vars: When ``use_unsafe_shell=False`` this argument
            dictates whether ``~`` is expanded in paths and environment variables
            are expanded before running the command. When ``True`` a string such as
            ``$SHELL`` will be expanded regardless of escaping. When ``False`` and
            ``use_unsafe_shell=False`` no path or variable expansion will be done.
        :kw pass_fds: When running on Python 3 this argument
            dictates which file descriptors should be passed
            to an underlying ``Popen`` constructor. On Python 2, this will