I just realized that the code to generate buildings from a string template and randomize them is so universally useful I can throw away my road generation logic completely and just add templates for all possible tiles. That's easier to manage and I can even use the randomization feature to add trees or other things to the roads.