### 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)

task_id="tail",
            external_dag_id=dag.dag_id,
            external_task_id=head.task_id,
            execution_date="{{ macros.ds_add(ds, 1) }}",
        )
        head >> body >> tail
    dag_bag.bag_dag(dag=dag, root_dag=dag)
    return dag_bag
@provide_session
def test_clear_overlapping_external_task_marker(dag_bag_head_tail, session):
    dag: DAG = dag_bag_head_tail.get_dag("head_tail")
    
    for delta in range(0, 10):
        execution_date = DEFAULT_DATE + timedelta(days=delta)
        dagrun = DagRun(
            dag_id=dag.dag_id,
            state=DagRunState.SUCCESS,
            execution_date=execution_date,
            run_type=DagRunType.MANUAL,
            run_id=f"test_{delta}",
        )
        session.add(dagrun)
        for task in dag.tasks:
            ti = TaskInstance(task=task)
            dagrun.task_instances.append(ti)
            ti.state = TaskInstanceState.SUCCESS
    session.flush()