ENH: `Styler.apply` accept ndarray return with `axis=None` for consistency 
- [x] closes #39359
- [x] tests added / passed
- [x] Ensure all linting tests pass, see [here](https://pandas.pydata.org/pandas-docs/dev/development/contributing.html#code-standards) for how to run them
- [x] whatsnew entry

Also minor edits to docs to extend information and show examples.

cc @TomAugspurger 
this is ready for review.

It fixes the functionality and edits the docs where necessary, including some better examples. > not sure we should change this. why can't the user just wrap the return value _inside_ the apply.

Dont know why this restriction was placed in the first place. If you use `axis in [0,1]` then your function must return 1-dim array like (numpy array allowed), but `axis=None` must need a `DataFrame`. This makes it quite painful to implement simple numpy functions like `nanmax` cause the user has to deal with the different cases and match the return type.

The builtin functions always have, for example, logic like this:
```
        if data.ndim == 1:  # Series from .apply
            return [attr if v else "" for v in extrema]
        else:  # DataFrame from .tee
            return pd.DataFrame(
                np.where(extrema, attr, ""), index=data.index, columns=data.columns
            )
```

I  dont really understand the downside to just handling an array function output in all cases for axis. @jreback changes done. mostly green. fails unrelated it seems thanks @attack68 