Predicate collections on a public traverse method

instead of a protected foreach method. This makes the framework less
opaque, and maintains an unintrusive namespace. Unlike foreach,
traverse is not polymorphic in its parameter's return type, enabling
box-free specialized collection traversal. Extensions implement foreach
with the usual polytype signature.