### Apache Airflow version

2.4.3, 2.5.0

### What happened

when use output from task decorator as parameter (external_task_ids) in ExternalTaskSensor, it show up this log:

```
Broken DAG: [+++++/airflow/dags/TEST_NEW_PIPELINE.py] Traceback (most recent call last):
  File "+++++/env3.10.5/lib/python3.10/site-packages/airflow/models/baseoperator.py", line 408, in apply_defaults
    result = func(self, **kwargs, default_args=default_args)
  File "+++++/env3.10.5/lib/python3.10/site-packages/airflow/sensors/external_task.py", line 164, in __init__
    if external_task_ids and len(external_task_ids) > len(set(external_task_ids)):
TypeError: object of type 'PlainXComArg' has no len()
```

note: +++++ is just a mask for irrelevant information.

### What you think should happen instead

this document https://airflow.apache.org/docs/apache-airflow/stable/tutorial/taskflow.html
show that we can use it without any warning, note about it.

found relative problem in [https://github.com/apache/airflow/issues/27328](url)
should move all the check in __\_\_init\_\___ into __poke__ method.

### How to reproduce

```
from airflow.decorators import dag, task
from airflow.operators.python import get_current_context

from airflow.sensors.external_task import ExternalTaskSensor
from datetime import datetime

configure = {"dag_id": "test_new_skeleton",
                    "schedule": None,
                    "start_date": datetime(2022,1,1),
}

@task
def preprocess_dependency() -> list:
    return ["random-task-name"]

@dag(**configure)
def pipeline(): 
    t_preprocess = preprocess_dependency()
    task_dependency = ExternalTaskSensor(task_id=f"Check_Dependency",
                                         external_dag_id='random-dag-name-that-exist',
                                         external_task_ids=t_preprocess ,
                                         poke_interval=60,
                                         mode="reschedule",
                                         timeout=172800,
                                         allowed_states=['success'],
                                         failed_states=['failed', 'skipped'],
                                         check_existence=True,)


dag = pipeline()
```


### Operating System

REHL 7

### Versions of Apache Airflow Providers

_No response_

### Deployment

Virtualenv installation

### Deployment details

_No response_

### Anything else

_No response_

### Are you willing to submit PR?

- [ ] 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)

:param execution_delta: time difference with the previous execution to
        look at, the default is the same logical date as the current task or DAG.
        For yesterday, use [positive!] datetime.timedelta(days=1). Either
        execution_delta or execution_date_fn can be passed to
        ExternalTaskSensor, but not both.
    :param execution_date_fn: function that receives the current execution's logical date as the first
        positional argument and optionally any number of keyword arguments available in the
        context dictionary, and returns the desired logical dates to query.
        Either execution_delta or execution_date_fn can be passed to ExternalTaskSensor,
        but not both.
    :param check_existence: Set to `True` to check if the external task exists (when
        external_task_id is not None) or check if the DAG to wait for exists (when
        external_task_id is None), and immediately cease waiting if the external task
        or DAG does not exist (default value: False).
    """
    template_fields = ["external_dag_id", "external_task_id", "external_task_ids"]
    ui_color = "#19647e"
    operator_extra_links = [ExternalDagLink()]
    def __init__(
        self,
        *,
        external_dag_id: str,
        external_task_id: str | None = None,
        external_task_ids: Collection[str] | None = None,
        external_task_group_id: str | None = None,
        allowed_states: Iterable[str] | None = None,
        failed_states: Iterable[str] | None = None,
        execution_delta: datetime.timedelta | None = None,
        execution_date_fn: Callable | None = None,
        check_existence: bool = False,