### Summary

The "block" action is very useful, but unfortunately fails with the following error when nested inside of handlers.

> ERROR! Unexpected Exception, this is probably a bug: 'Block' object has no attribute 'is_host_notified'

```
Traceback (most recent call last):
  File "/usr/local/lib/python3.9/dist-packages/ansible/cli/__init__.py", line 647, in cli_executor
    exit_code = cli.run()
  File "/usr/local/lib/python3.9/dist-packages/ansible/cli/playbook.py", line 143, in run
    results = pbex.run()
  File "/usr/local/lib/python3.9/dist-packages/ansible/executor/playbook_executor.py", line 190, in run
    result = self._tqm.run(play=play)
  File "/usr/local/lib/python3.9/dist-packages/ansible/executor/task_queue_manager.py", line 333, in run
    play_return = strategy.run(iterator, play_context)
  File "/usr/local/lib/python3.9/dist-packages/ansible/plugins/strategy/linear.py", line 151, in run
    host_tasks = self._get_next_task_lockstep(hosts_left, iterator)
  File "/usr/local/lib/python3.9/dist-packages/ansible/plugins/strategy/linear.py", line 71, in _get_next_task_lockstep
    state, task = iterator.get_next_task_for_host(host, peek=True)
  File "/usr/local/lib/python3.9/dist-packages/ansible/executor/play_iterator.py", line 258, in get_next_task_for_host
    (s, task) = self._get_next_task_from_state(s, host=host)
  File "/usr/local/lib/python3.9/dist-packages/ansible/executor/play_iterator.py", line 452, in _get_next_task_from_state
    if task.is_host_notified(host):
AttributeError: 'Block' object has no attribute 'is_host_notified'
```

### Issue Type

Bug Report

### Component Name

core

### Ansible Version

```console
$ ansible --version
ansible [core 2.14.2]
  config file = None
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/lib/python3.9/dist-packages/ansible
  ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/local/bin/ansible
  python version = 3.9.2 (default, Feb 28 2021, 17:03:44) [GCC 10.2.1 20210110] (/usr/bin/python3)
  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
```


### OS / Environment

Debian Bullseye

### Steps to Reproduce

<!--- Paste example playbooks or commands between quotes below -->
test.yml:
```yaml (paste below)
- hosts: localhost
  connection: local
  gather_facts: no
  tasks:
    - name: test task
      pause: ""
      changed_when: true
      notify: test handler
  handlers:
    - name: test handler
      block:
        - name: task in block
          pause: ""
        - name: nested block
          block:
            - name: task in nested block
              pause: ""
```

Run with:
```
ansible-playbook -vvv -i localhost, test.yml
```

### Expected Results

Should reach and execute "task in nested block"

### Actual Results

```console
ansible-playbook [core 2.14.2]
  config file = None
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/lib/python3.9/dist-packages/ansible
  ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/local/bin/ansible-playbook
  python version = 3.9.2 (default, Feb 28 2021, 17:03:44) [GCC 10.2.1 20210110] (/usr/bin/python3)
  jinja version = 3.1.2
  libyaml = True
No config file found; using defaults
Parsed localhost, inventory source with host_list plugin
Skipping callback 'default', as we already have a stdout callback.
Skipping callback 'minimal', as we already have a stdout callback.
Skipping callback 'oneline', as we already have a stdout callback.

PLAYBOOK: test.yml *******************************************************************************************************************************************************************************1 plays in test.yml

PLAY [localhost] *********************************************************************************************************************************************************************************ERROR! Unexpected Exception, this is probably a bug: 'Block' object has no attribute 'is_host_notified'
the full traceback was:

Traceback (most recent call last):
  File "/usr/local/lib/python3.9/dist-packages/ansible/cli/__init__.py", line 647, in cli_executor
    exit_code = cli.run()
  File "/usr/local/lib/python3.9/dist-packages/ansible/cli/playbook.py", line 143, in run
    results = pbex.run()
  File "/usr/local/lib/python3.9/dist-packages/ansible/executor/playbook_executor.py", line 190, in run
    result = self._tqm.run(play=play)
  File "/usr/local/lib/python3.9/dist-packages/ansible/executor/task_queue_manager.py", line 333, in run
    play_return = strategy.run(iterator, play_context)
  File "/usr/local/lib/python3.9/dist-packages/ansible/plugins/strategy/linear.py", line 151, in run
    host_tasks = self._get_next_task_lockstep(hosts_left, iterator)
  File "/usr/local/lib/python3.9/dist-packages/ansible/plugins/strategy/linear.py", line 71, in _get_next_task_lockstep
    state, task = iterator.get_next_task_for_host(host, peek=True)
  File "/usr/local/lib/python3.9/dist-packages/ansible/executor/play_iterator.py", line 258, in get_next_task_for_host
    (s, task) = self._get_next_task_from_state(s, host=host)
  File "/usr/local/lib/python3.9/dist-packages/ansible/executor/play_iterator.py", line 452, in _get_next_task_from_state
    if task.is_host_notified(host):
AttributeError: 'Block' object has no attribute 'is_host_notified'
```


### Code of Conduct

- [X] I agree to follow the Ansible Code of Conduct
ir = IncludeRole.load(
                    task_ds,
                    block=block,
                    role=role,
                    task_include=None,
                    variable_manager=variable_manager,
                    loader=loader,
                )
                
                
                is_static = False
                if action in C._ACTION_IMPORT_ROLE:
                    is_static = True
                if is_static:
                    if ir.loop is not None:
                        if action in C._ACTION_IMPORT_ROLE:
                            raise AnsibleParserError("You cannot use loops on 'import_role' statements. You should use 'include_role' instead.", obj=task_ds)
                        else:
                            raise AnsibleParserError("You cannot use 'static' on an include_role with a loop", obj=task_ds)
                    
                    ir.statically_loaded = True
                    
                    all_vars = variable_manager.get_vars(play=play, task=ir)
                    templar = Templar(loader=loader, variables=all_vars)
                    ir._role_name = templar.template(ir._role_name)
                    
                    blocks, _ = ir.get_block_list(variable_manager=variable_manager, loader=loader)
                    task_list.extend(blocks)
                else: