immutable bot stepper, then factor out Bot::dir()