PERF/REF: Check use of numexpr earlier in the DataFrame operation
This PR tries to gather some checks about whether numexpr can be used or not which can be done upfront on the DataFrame level, before dispatching to the array_ops. 
For example, for a scalar right operand, we can check it only once if it's compatible with numexpr usage. Or for ArrayManager, we can check the size constraint once upfront (since each array has the same size). For those cases, this avoids overhead in `expressions.evaluate`. 

To this end, I created a new `can_use_numexpr` that starts to gather some checks (there might be more that can be added), call this up front in `DataFrame._dispatch_frame_op` (this could IMO be bit cleaner with https://github.com/pandas-dev/pandas/pull/39772, but the if/else checks inside `_dispatch_frame_op` work as well). And then the result of `can_use_numexpr` is passed through to the array_ops. 