don't have side-effects inside an assert()

It's easy to miss visually, and can be compiled away if NDEBUG
is defined!
constexprify and clean up much of non_normalized_rational

This makes the code a bit shorter.
make shift_right(num, shift, rounding_strategy)
Make Esc ungrab, Ctrl/Cmd-Q quit.  (And related fixes.)