### Apache Airflow version

2.7.0

### What happened

When using the `EmrAddStepsOperator`, trying to use `deferrable=True` causes an exception from the Amazon provider:

```
[2023-09-07, 16:02:56 UTC] {taskinstance.py:1720} ERROR - Trigger failed:
Traceback (most recent call last):
  File "/home/***/.local/lib/python3.11/site-packages/***/jobs/triggerer_job_runner.py", line 527, in cleanup_finished_triggers
    result = details["task"].result()
             ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/***/.local/lib/python3.11/site-packages/***/jobs/triggerer_job_runner.py", line 599, in run_trigger
    async for event in trigger.run():
  File "/home/***/.local/lib/python3.11/site-packages/***/providers/amazon/aws/triggers/emr.py", line 74, in run
    for attempt in range(1, 1 + self.max_attempts):
                            ~~^~~~~~~~~~~~~~~~~~~
TypeError: unsupported operand type(s) for +: 'int' and 'str'
```

The problem seems to stem from the `max_attempts` value being stored as an `int` when the `EmrAddStepsTrigger` class is instantiated, but when `run` is called later, it becomes a `str`.  The simple fix is to wrap the access with `int()`, but I'm not sure if that's the _correct_ fix.  For some reason, `EmrAddStepsTrigger` extends `BaseTrigger` from Airflow instead of `AwsBaseWaiterTrigger` like the rest of the EMR triggers even though it uses an AWS waiter.  Perhaps the more appropriate fix would be to rewrite this trigger to use the AWS-specific base class.

### What you think should happen instead

The `EmrAddStepOperator` should work when deferred

### How to reproduce

Minimal DAG, run using the `apache/airflow:2.7.0-python3.11` image with the provided docker-compose.yaml file:

```python
from datetime import datetime

from airflow import DAG
from airflow.providers.amazon.aws.operators.emr import EmrAddStepsOperator

with DAG(
    "emr_defer_test",
    start_date=datetime(2021, 1, 1),
    catchup=False,
    schedule_interval=None,
) as dag:
    # this will work on any EMR cluster, put your cluster ID here
    job_flow_id = "j-1M0574ZKPRD9H"

    EmrAddStepsOperator(
        task_id="run_deferred",
        job_flow_id=job_flow_id,
        steps=[
            {
                "Name": "hello-world",
                "ActionOnFailure": "CONTINUE",
                "HadoopJarStep": {
                    "Jar": "command-runner.jar",
                    "Args": "sleep 60".split(),
                }
            }
        ],
        deferrable=True,
    )
```

### Operating System

Docker on MacOS 13.5.1 via colima

### Versions of Apache Airflow Providers

```
apache-airflow-providers-amazon==8.5.1
apache-airflow-providers-celery==3.3.2
apache-airflow-providers-common-sql==1.7.0
apache-airflow-providers-ftp==3.5.0
apache-airflow-providers-http==4.5.0
apache-airflow-providers-imap==3.3.0
apache-airflow-providers-postgres==5.6.0
apache-airflow-providers-sqlite==3.4.3
```

### Deployment

Docker-Compose

### Deployment details

_No response_

### Anything else

_No response_

### Are you willing to submit PR?

- [X] Yes I am willing to submit a PR!

### Code of Conduct

- [X] I agree to follow this project's [Code of Conduct](https://github.com/apache/airflow/blob/main/CODE_OF_CONDUCT.md)

"""
    Poll an Emr Serverless application and wait for it to be created.
    :param application_id: The ID of the application being polled.
    :waiter_delay: polling period in seconds to check for the status
    :param waiter_max_attempts: The maximum number of attempts to be made
    :param aws_conn_id: Reference to AWS connection id
    """
    def __init__(
        self,
        application_id: str,
        waiter_delay: int = 30,
        waiter_max_attempts: int = 60,
        aws_conn_id: str = "aws_default",
    ) -> None:
        super().__init__(
            serialized_fields={"application_id": application_id},
            waiter_name="serverless_app_created",
            waiter_args={"applicationId": application_id},
            failure_message="Application creation failed",
            status_message="Application status is",
            status_queries=["application.state", "application.stateDetails"],
            return_key="application_id",
            return_value=application_id,
            waiter_delay=waiter_delay,
            waiter_max_attempts=waiter_max_attempts,
            aws_conn_id=aws_conn_id,
        )
    def hook(self) -> AwsGenericHook:
        return EmrServerlessHook(self.aws_conn_id)
class EmrServerlessStartApplicationTrigger(AwsBaseWaiterTrigger):