Standardize special case in tz_conversion functions
ATM `_tz_convert_dst` handles iteration and masking differently (and more complicated-ly) than other related functions.  AFAICT the reasoning is that this implementation is performant when the passed `vals` have a high proportion of `iNaT`s.

By changing this special case to conform to the standard pattern, we allow other functions to call this without having to do any special casting, generally simplify things, and open the door to de-duplicating these functions (which this PR also starts doing by implementing `_tz_convert`)

- [ ] closes #xxxx
- [ ] tests added / passed
- [ ] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [ ] whatsnew entry

# [Codecov](https://codecov.io/gh/pandas-dev/pandas/pull/22181?src=pr&el=h1) Report
> Merging [#22181](https://codecov.io/gh/pandas-dev/pandas/pull/22181?src=pr&el=desc) into [master](https://codecov.io/gh/pandas-dev/pandas/commit/def50e26f78c507a743fa11fee98230412ae50a8?src=pr&el=desc) will **not change** coverage.
> The diff coverage is `n/a`.

[![Impacted file tree graph](https://codecov.io/gh/pandas-dev/pandas/pull/22181/graphs/tree.svg?width=650&height=150&token=eZ4WkYLtcO&src=pr)](https://codecov.io/gh/pandas-dev/pandas/pull/22181?src=pr&el=tree)

```diff
@@           Coverage Diff           @@
##           master   #22181   +/-   ##
=======================================
  Coverage   92.06%   92.06%           
=======================================
  Files         169      169           
  Lines       50694    50694           
=======================================
  Hits        46671    46671           
  Misses       4023     4023
```

| Flag | Coverage Δ | |
|---|---|---|
| #multiple | `90.47% <ø> (ø)` | :arrow_up: |
| #single | `42.32% <ø> (ø)` | :arrow_up: |


------

[Continue to review full report at Codecov](https://codecov.io/gh/pandas-dev/pandas/pull/22181?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/pandas-dev/pandas/pull/22181?src=pr&el=footer). Last update [def50e2...624e1a8](https://codecov.io/gh/pandas-dev/pandas/pull/22181?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).
 thanks!