REF/API: String methods refactor
edit: probably closing this: See https://github.com/pandas-dev/pandas/pull/29640 for a simpler alternative.

In preparation for https://github.com/pandas-dev/pandas/pull/29597, this changes the string methods implemetation to

* Use masks to apply the function just to valid values.
* Disables all unnecessary inference on the result.

This works quite well for the new StringDtype, since we know the values are always string. The object-dtype behavior is a bit more complex. I'll note that inline below.

Additionally, it fixes https://github.com/pandas-dev/pandas/issues/29624

edit: Oh, forgot another change. String methods returning numeric values will return a nullable integer type. So `Series[string].str.count('a')` returns an Int64Dtype, rather than a maybe int or maybe float (depending on the presence of NAs). Will document that.
cc @jorisvandenbossche  > long term, we might want something like lib.map_infer but where we can pass a mask? (so we don't need to filter first, and assign to a subset)

there *already* is a lib.map_infer_mask FYI > there already is a lib.map_infer_mask FYI

Which is what was being used before actually. Tom, what's the reason for no longer using it? Being able to pass the 'na' value might be useful (now it takes the original value from the array, which is not always what you want I suppose) > did you check performance? More or less the same as before?

checking now. Slowdown in things like `str.get` and `.str.decode` in a few cases.

Will look into re-using `map_infer_mask`. If I can pass through an `na_result` rather than the original, that may be enough. I wonder if it makes sense to just apply this change to just StringDtype? That'd keep the diff a lot smaller at least, and is probably less like to introduce new bugs. Closing in favor of https://github.com/pandas-dev/pandas/pull/29640