Additional optimizations

After some serious Valgrind profiling love:

- Use more moves to save string and Error objects copying
- Avoid some unnecessary string copying (in lint functions)
- Use unordered_map and unordered_set when not needing order
- StartsWith works directly with a C-String