Refactor NonDeterminism, move basic visitation logic to module

Visitable objects can now take the determinism of the visitor into
account by implementing accept_deterministic and accept_non_deterministic