### Apache Airflow version

2.6.1

### What happened

Sensor is fired with an exception ZeroDivisionError, if set up `mode="reschedule"`, `exponential_backoff=True` and `poke_interval=1` 

```
ERROR - Task failed with exception
Traceback (most recent call last):
  File "/home/airflow/.local/lib/python3.9/site-packages/airflow/sensors/base.py", line 244, in execute
    next_poke_interval = self._get_next_poke_interval(started_at, run_duration, try_number)
  File "/home/airflow/.local/lib/python3.9/site-packages/airflow/sensors/base.py", line 274, in _get_next_poke_interval
    modded_hash = min_backoff + run_hash % min_backoff
ZeroDivisionError: integer division or modulo by zero
```

### What you think should happen instead

Throw an human-readable exception about corner values for `poke_interval` or allow to set up this value less then 2 (if it's `>=` 2 - rescheduling works fine.)

### How to reproduce

```
from airflow.sensors.base import BaseSensorOperator
from airflow import DAG
import datetime

class TestSensor(BaseSensorOperator):
    def poke(self, context):
        return False

with DAG("test_dag", start_date=datetime.datetime.today(), schedule=None):
    sensor = TestSensor(task_id="sensor", mode="reschedule", poke_interval=1, exponential_backoff=True, max_wait=5)
```

### Operating System

Debian GNU/Linux 10 (buster)

### Versions of Apache Airflow Providers

_No response_

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

"""
        Test mode="reschedule", retries and timeout configurations interact correctly.
        Given a sensor configured like this:
        poke_interval=5
        timeout=10
        retries=2
        retry_delay=timedelta(seconds=3)
        If the second poke raises RuntimeError, all other pokes return False, this is how it should
        behave:
        00:00 Returns False                try_number=1, max_tries=2, state=up_for_reschedule
        00:05 Raises RuntimeError          try_number=2, max_tries=2, state=up_for_retry
        00:08 Returns False                try_number=2, max_tries=2, state=up_for_reschedule
        00:13 Raises AirflowSensorTimeout  try_number=3, max_tries=2, state=failed
        And then the sensor is cleared at 00:19. It should behave like this:
        00:19 Returns False                try_number=3, max_tries=4, state=up_for_reschedule
        00:24 Returns False                try_number=3, max_tries=4, state=up_for_reschedule
        00:26 Returns False                try_number=3, max_tries=4, state=up_for_reschedule
        00:31 Raises AirflowSensorTimeout, try_number=4, max_tries=4, state=failed
        """
        sensor, dr = make_sensor(
            return_value=None,
            poke_interval=5,
            timeout=10,
            retries=2,
            retry_delay=timedelta(seconds=3),
            mode="reschedule",
        )
        sensor.poke = Mock(side_effect=[False, RuntimeError, False, False, False, False, False, False])
        def assert_ti_state(try_number, max_tries, state):