REF: array_to_datetime catch overflows in one place
The diff is big, but all this is doing is changing:

```
if A:
    try:
        foo(...)
    except OutOfBoundsDatetime:
        handle(...)
elif B:
    try:
        bar(...)
    except OutOfBoundsDatetime:
        handle(...)
...
```

to:

```
try:
    if A:
        foo(...)
    elif B:
        bar(...)
    ...
except OutOfBoundsDatetime:
    handle(...)
...
```

Orthogonal to #24032, will need rebasing following #24031.  All three of these should go before #24006.