### Summary

Hello!

Since ansible-core 2.15 and later (I think since the changes introduced by #79558), it seems that, when multiple handlers of a same `listen` group are notified by another handler, only the first one in the group will be run.

From what I understand, when Ansible handles a `notify` when it is already iterating handlers, it will only consider the first handler that matches the notification, but will not iterate through all the matching handlers. I believe the `break` in `lib/ansible/plugins/strategy/__init__.py` (line 669) should only apply when when Ansible is not already iterating handlers (i.e., in the `else` branch):
https://github.com/ansible/ansible/blob/6ebefaceb6cd0d4961776a94d63a71fc1fc28bc0/lib/ansible/plugins/strategy/__init__.py#L659-L669

I think there seems to be a simple fix to that, which I'm planning to submit as a PR.

Thank you! :)

snip

### Issue Type

Bug Report

### Component Name

handlers

### Ansible Version

```console
$ ansible --version
ansible [core 2.16.0]
  config file = None
  configured module search path = ['/home/user/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3.11/site-packages/ansible
  ansible collection location = /home/user/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/bin/ansible
  python version = 3.11.6 (main, Nov 14 2023, 09:36:21) [GCC 13.2.1 20230801] (/usr/bin/python)
  jinja version = 3.1.2
  libyaml = True
```


### Configuration

```console
# if using a version older than ansible-core 2.12 you should omit the '-t all'
$ ansible-config dump --only-changed -t all
CONFIG_FILE() = None
EDITOR(env: EDITOR) = /usr/bin/vim
```


### OS / Environment

Arch Linux, with the following Ansible-related packages :
- ansible 9.0.1-1
- ansible-core 2.16.0-1

### Steps to Reproduce

<!--- Paste example playbooks or commands between quotes below -->
```yaml (paste below)
---
- name: test listen-based handlers with recursive notifications
  hosts: localhost
  gather_facts: false

  tasks:
    - name: notify handler 1
      command: echo
      changed_when: true
      notify: handler 1

  handlers:
    - name: handler 1
      debug:
        msg: handler 1
      changed_when: true
      notify: handler_2

    - name: handler 2a
      debug:
        msg: handler 2a
      listen: handler_2

    - name: handler 2b
      debug:
        msg: handler 2b
      listen: handler_2
```

### Expected Results

All handlers should be run, especially both handlers listening on the `handler_2` notification (i.e., `handler 2a` and `handler 2b`):
```
PLAY [test listen-based handlers with recursive notifications] **************************************************************************************

TASK [notify handler 1] *****************************************************************************************************************************
task path: /tmp/ansible/test.yml:7
Notification for handler handler 1 has been saved.
changed: [localhost] => {"changed": true, "cmd": ["echo"], "delta": "0:00:00.004205", "end": "2023-12-06 10:57:16.556224", "msg": "", "rc": 0, "start": "2023-12-06 10:57:16.552019", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
NOTIFIED HANDLER handler 1 for localhost

RUNNING HANDLER [handler 1] *************************************************************************************************************************
task path: /tmp/ansible/test.yml:13
NOTIFIED HANDLER handler 2a for localhost
NOTIFIED HANDLER handler 2b for localhost
changed: [localhost] => {
    "msg": "handler 1"
}

RUNNING HANDLER [handler 2a] ************************************************************************************************************************
task path: /tmp/ansible/test.yml:19
ok: [localhost] => {
    "msg": "handler 2a"
}

RUNNING HANDLER [handler 2b] ************************************************************************************************************************
task path: /tmp/ansible/test.yml:24
ok: [localhost] => {
    "msg": "handler 2b"
}

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

### Actual Results

```console
PLAY [test listen-based handlers with recursive notifications] ***********************************************************

TASK [notify handler 1] **************************************************************************************************
task path: /tmp/ansible/test.yml:7
Notification for handler handler 1 has been saved.
changed: [localhost] => {"changed": true, "cmd": ["echo"], "delta": "0:00:00.003800", "end": "2023-12-06 10:56:26.513556", "msg": "", "rc": 0, "start": "2023-12-06 10:56:26.509756", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
NOTIFIED HANDLER handler 1 for localhost

RUNNING HANDLER [handler 1] **********************************************************************************************
task path: /tmp/ansible/test.yml:13
NOTIFIED HANDLER handler 2a for localhost
changed: [localhost] => {
    "msg": "handler 1"
}

RUNNING HANDLER [handler 2a] *********************************************************************************************
task path: /tmp/ansible/test.yml:19
ok: [localhost] => {
    "msg": "handler 2a"
}

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


### Code of Conduct

- [X] I agree to follow the Ansible Code of Conduct
strategy._tqm.send_callback(result.method_name, *result.args, **result.kwargs)
            elif isinstance(result, TaskResult):
                strategy.normalize_task_result(result)
                with strategy._results_lock:
                    strategy._results.append(result)
            elif isinstance(result, PromptSend):
                try:
                    value = display.prompt_until(
                        result.prompt,
                        private=result.private,
                        seconds=result.seconds,
                        complete_input=result.complete_input,
                        interrupt_input=result.interrupt_input,
                    )
                except AnsibleError as e:
                    value = e
                except BaseException as e:
                    
                    try:
                        raise AnsibleError(f"{e}") from e
                    except AnsibleError as e:
                        value = e
                strategy._workers[result.worker_id].worker_queue.put(value)
            else:
                display.warning('Received an invalid object (%s) in the result queue: %r' % (type(result), result))
        except (IOError, EOFError):
            break
        except queue.Empty:
            pass
def debug_closure(func):