Make Path.prototype.replace more forgiving of array modifications.

This logic used to be part of the replace method, and I thought I could
take it out, but I was wrong.
Implement types.visit as an alternative to types.traverse.

This work began over in the recast repository (see
https://github.com/benjamn/recast/pull/99), but ultimately it made more
sense to implement here, since I want to deprecate types.traverse
eventually, and I don't want to add recast as a dependency of ast-types.
Add tests of types.visit.
Don't expose computeSupertypeLookupTable on public ast-types module.

Exposing this interface was necessary when PathVisitor was implemented in
the recast project, but now that we've moved PathVisitor into ast-types,
it makes more sense to keep this interface private.
Reimplement types.traverse in terms of types.visit.
Politely warn about the deprecation of types.traverse.