Re-implement lint with less emphasis on item ids

This way it's much easier to add lints throughout compilation correctly, and
functions on impls can alter the way lints are emitted.
Optimize lint passes to perform far fewer allocations

Achieves ~3x speedup on lint passes for libcore
Change lints to indicate exactly where the level was set