Many operators assume the upstream value and an argument have the same shape. Typing them is not straight-forward, because it's hard to constrain the type of T in a method in TypeScript.
With some help from @justinfagnani and @rictic, we've realized that you can constrain these types by having U be the intersection of T and its valid types, and then having your argument also be of the type U.
Unfortunately, the gymnastics required to do this is noise that makes the operator implementations harder to follow. Thus, I've abstracted it all into _mathOperator and made each of the mathematical operators delegate to that method. This makes it easier to maintain those operators, and to potentially add new ones in the future. The types, and the ability to work on either numbers or points, can be shared across them.