DRY and Scalify _(up/down)hill(/4)

also un-rejigger; these are rarely used primitives with
big bodies, so probably not worth inlining; better to be
able to DRY (which rejiggering forbids)