Multiple directory support in source generators

Routes and templates source generators previously could only generate sources for one directory at a time.  The problem is, if there were multiple source directories, there would only be one generated directory, and they always scanned the generated directory in order to delete generated files that no longer had source equivalents.  This meant there was a race condition, because source generators run in parallel, if a generated file was found but the header hadn't been written, it would be deleted.

This fixes it to ensure that each source generator only needs to run once, so projects with multple source directories (eg, the documentation project) don't have this race condition.

Also made routes generated source handling more robust.