REF: separate flex from non-flex DataFrame ops
- [x] closes #36796
- [x] tests added / passed
- [x] passes `black pandas`
- [x] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [x] whatsnew entry

Unless supporting this is intentional, in which case we should deprecate and explicitly implement flex-bool operations.

If/when this is done, we can stop passing `special` and even `cls`.
i guess technicaly this is an api change, so add a note.

cc @TomAugspurger if any comments. I'm not sure what a "flex" method is. What's the user-facing change here? "flex" methods are all the non-dunder arith/cmp ops: add, sub, eq, ne, ...

The user facing change is that `frame.__and__(other, axis=0, fill_value= ...)`, or other dunder methods non-idiomatically accepting kwargs.  The potential trouble is that for &|^, there are no non-dunder versions with the kwarg support. can you rebase > The user facing change is that frame.__and__(other, axis=0, fill_value= ...), or other dunder methods non-idiomatically accepting kwargs.

So this would break explicitly calling `frame.__and__(other, axis=0)`? I'm fine with that. I'm fine with not calling that a breaking change since dunder methods should be called by using the operators or the `operator` module. whatsnew added, green-as-it-gets thanks