PERF: block-wise ops for scalar and series
This extends #28583 to handle `op(frame, series)` (whereas 28583 handles only `op(frame, scalar)`).

I got this passing locally, haven't gone back through to do e.g. lint fixups.  There are a few places where this surfaced bugs that can be fixed independently.

