REF: simplify NDFrame.replace, ObjectBlock.replace
This makes it so that we only call BlockManager.replace from one spot, so we can rule out more cases when reasoning about the arguments in ObjectBlock.replace.

This will have a merge conflict with #37696; doesnt matter which one goes in first.  One both are in, there are further simplifications available.

I'm hopeful that we'll be able to get rid of Categorical.replace altogether (and with it, CategoricalBlock.replace, CategoricalBlock._replace_list), but that's a few steps away at best.
