### Summary

Hi
I have noticed that the **display_failed_stderr** in  setting just send task errors to stderr when the the task which is failing does not have a loop. If the task which fails has a loop then the the output is never sent to stderr, even if all items in the loop fail.

This prevents effective filtering of errors by greping stderr, given that not all failed tasks are sent to it.

Thanks!

### Issue Type

Bug Report

### Component Name

community.general collection

### Ansible Version

```console
ansible [core 2.11.0]
  config file = /Users/miqueladrover/.ansible.cfg
  configured module search path = ['/Users/miqueladrover/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/lib/python3.9/site-packages/ansible
  ansible collection location = /Users/miqueladrover/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/local/bin/ansible
  python version = 3.9.5 (default, May  4 2021, 03:36:27) [Clang 12.0.0 (clang-1200.0.32.29)]
  jinja version = 3.0.1
  libyaml = True
```


### Configuration

```console
ANSIBLE_PIPELINING(/Users/miqueladrover/.ansible.cfg) = True
DEFAULT_FORKS(/Users/miqueladrover/.ansible.cfg) = 50
DEFAULT_STRATEGY_PLUGIN_PATH(/Users/miqueladrover/.ansible.cfg) = ['/usr/local/lib/python3.7/site-packages/ansible_mitogen/plugins/strategy']
HOST_KEY_CHECKING(/Users/miqueladrover/.ansible.cfg) = False
```


### OS / Environment

OSX, Centos 7

### Steps to Reproduce

In the following example playbook you would expect to see four tasks to be sent to stderr, but only the first is really sent to it.

```
---
- hosts: localhost
  any_errors_fatal: true
  gather_facts: false
  tasks:
    - command: 'false'
      ignore_errors: true

    - command: "{{ item }}"
      loop:
        - 'true'
        - 'false'
      ignore_errors: true

    - command: "{{ item }}"
      loop:
        - 'false'
        - 'false'
```



### Expected Results

```
$ ANSIBLE_DISPLAY_FAILED_STDERR=true ansible-playbook display_failed_stderr.yml > /dev/null
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'
fatal: [localhost]: FAILED! => {"changed": true, "cmd": ["false"], "delta": "0:00:00.006033", "end": "2021-05-31 11:14:56.067248", "msg": "non-zero return code", "rc": 1, "start": "2021-05-31 11:14:56.061215", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
failed: [localhost] (item=false) => {"ansible_loop_var": "item", "changed": true, "cmd": ["false"], "delta": "0:00:00.006255", "end": "2021-05-31 11:14:49.104375", "item": "false", "msg": "non-zero return code", "rc": 1, "start": "2021-05-31 11:14:49.098120", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
failed: [localhost] (item=false) => {"ansible_loop_var": "item", "changed": true, "cmd": ["false"], "delta": "0:00:00.006004", "end": "2021-05-31 11:14:49.354347", "item": "false", "msg": "non-zero return code", "rc": 1, "start": "2021-05-31 11:14:49.348343", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
failed: [localhost] (item=false) => {"ansible_loop_var": "item", "changed": true, "cmd": ["false"], "delta": "0:00:00.005797", "end": "2021-05-31 11:14:49.571522", "item": "false", "msg": "non-zero return code", "rc": 1, "start": "2021-05-31 11:14:49.565725", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
```

### Actual Results


The non-filtered output is:
```console
$ ANSIBLE_DISPLAY_FAILED_STDERR=true ansible-playbook display_failed_stderr.yml
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'

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

TASK [command] *****************************************************************************************************************************************************************************************************************************
fatal: [localhost]: FAILED! => {"changed": true, "cmd": ["false"], "delta": "0:00:00.006232", "end": "2021-05-31 11:14:48.623654", "msg": "non-zero return code", "rc": 1, "start": "2021-05-31 11:14:48.617422", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
...ignoring

TASK [command] *****************************************************************************************************************************************************************************************************************************
changed: [localhost] => (item=true)
failed: [localhost] (item=false) => {"ansible_loop_var": "item", "changed": true, "cmd": ["false"], "delta": "0:00:00.006255", "end": "2021-05-31 11:14:49.104375", "item": "false", "msg": "non-zero return code", "rc": 1, "start": "2021-05-31 11:14:49.098120", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
...ignoring

TASK [command] *****************************************************************************************************************************************************************************************************************************
failed: [localhost] (item=false) => {"ansible_loop_var": "item", "changed": true, "cmd": ["false"], "delta": "0:00:00.006004", "end": "2021-05-31 11:14:49.354347", "item": "false", "msg": "non-zero return code", "rc": 1, "start": "2021-05-31 11:14:49.348343", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
failed: [localhost] (item=false) => {"ansible_loop_var": "item", "changed": true, "cmd": ["false"], "delta": "0:00:00.005797", "end": "2021-05-31 11:14:49.571522", "item": "false", "msg": "non-zero return code", "rc": 1, "start": "2021-05-31 11:14:49.565725", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}

NO MORE HOSTS LEFT *************************************************************************************************************************************************************************************************************************

PLAY RECAP *********************************************************************************************************************************************************************************************************************************
localhost                  : ok=2    changed=2    unreachable=0    failed=1    skipped=0    rescued=0    ignored=2
```
and redirecting stdout to /dev/null:
```
ANSIBLE_DISPLAY_FAILED_STDERR=true ansible-playbook display_failed_stderr.yml > /dev/null
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'
fatal: [localhost]: FAILED! => {"changed": true, "cmd": ["false"], "delta": "0:00:00.006033", "end": "2021-05-31 11:14:56.067248", "msg": "non-zero return code", "rc": 1, "start": "2021-05-31 11:14:56.061215", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
```
```


### Code of Conduct

- [X] I agree to follow the Ansible Code of Conduct
'''
    This is the default callback interface, which simply prints messages
    to stdout when new callback events are received.
    '''
    CALLBACK_VERSION = 2.0
    CALLBACK_TYPE = 'stdout'
    CALLBACK_NAME = 'default'
    def __init__(self):
        self._play = None
        self._last_task_banner = None
        self._last_task_name = None
        self._task_type_cache = {}
        super(CallbackModule, self).__init__()
    def set_options(self, task_keys=None, var_options=None, direct=None):