REF: Add ExtensionArray.map
- [x] closes https://github.com/pandas-dev/pandas/issues/23179

Working with the `.map` method is very uncomfortable in main, because of issues with `ExtensionArray`:
* `ExtensionArray` is not required to  have a `.map` method, but may have it.
* Some `ExtensionArray` subclasses, that do have a `map` method have one function parameter (`mapper`), while other have two parameters (`mapper` and `na_action`).
* There is fallback functionality for calculation  `ExtensionArray.map` in `IndexOps.Mixin._map_values`. This means we can calculate `.map` for `ExtensionArrays` indirectly, if we wrap them in a `Series` or `Index`, but we cannot rely on the ability to do  it directly on the `ExtensionArray`.
* `ExtensionArray` subclasses often want create their own `.map` methods
* Because of all the above issues it is often very maze-like to follow code that uses `.map`

This PR solves this by:
1. moving the functionality in `IndexOpsMixin._map_values` to a function `map_array` in `algorithms`.
2.  adding a `.map` method to `ExtensionArray` that calls the new `map_array` function. Subclasses will override this method where needed.
3. Call the new `map_array` function inside `IndexOpsMixin._map_values`. 
4. Ensuring a common signature for the `.map` method for `ExtensionArray`, i.e. always two method parameters (`mapper` and `na_action`), so we can reliably call the `.map` method on any `ExtensionArray` subclass.

Note that this PR doesn't really add new functionality, because we're mostly just moving code around, though it is now possible to call the `map` method on any `Extensionarray` directly, instead of going through e.g. `Series.map`.

In the main branch, there are currently several `ExtensionArray` subclasses where `na_action='ignore'` doesn't work. I'm working on making it work with all of the `ExtensionArray` subclasses and there is already #51645, which handles `Categorical`/`CategoricalIndex` and more will follow.

Does this close any of #23179, #15706, #32815? > Does this close any of #23179, #15706, #32815?

* #23179: Yes (adds `.map` to `ExtensionArray`)
* #15706: I don't think this issue is solveable while maintaining the performance benefits of a dedicated `Categorical.map` , (i.e. doing the op only once per category is intended).
* #32815: not in this PR, but that is fixed by #51645 for the `Categorical`/`CategoricalIndex` case. I'll take on `DateTimeArray`/`DateTimeIndex` etc. in a follow-up, so that will be fixed shortly.
 Might need something in the extension tests? > Might need something in the extension tests?

I've added some simple tests in the newest version. I've updated. Gentle ping.

I’m intending to follow up with fixes towards #51644, and it would be great if this could be merged. Merge when ready @jbrockmendel  thanks @topper-123  @topper-123 does any of your recent work on this close #15706? I'vew answered in #15706 to keep the discussion in one place.