You can probably remove this from the Start function:
Log.Info("Create town list ... (can take a while on large maps)", Log.LVL_INFO);
Just looping over all towns and add them to a list is not that slow even with lots of towns. What I do is to for each town also loop over all other towns. That is why it take long time on maps with many towns.
Edit: Perhaps degrade this log statement to LVL_DEBUG or LVL_SUB_DECISIONS:
Log.Info("End of Town Management.", Log.LVL_INFO);
Otherwise you use the log system for no good really if you log everything at the same log level, you could just use GSLog.Info(..) directly.
Edit2: In Town.nut, use Helper.GetPAXCargo() and Helper.GetMailCargo() to aquire the id of those cargos instead of hard coding 0 and 2. That way you keep better compatibility with NewGRFs. Both those functions cache the result in a hidden global variable, so except for the first call, they are very fast.
Edit3: You should change version.nut to indicate the version of your Game Script, which I believe is 1 and not 3. Usually this value is kept in info.nut, but I moved it to version.nut that is included by both info.nut and main.nut so that I can access the version number of the script at run time. If you don't need that you can remove version.nut and replace SELF_VERSION with 1 in info.nut.
_________________My OpenTTD contributions
(AIs, Game Scripts, patches, OpenTTD Auto Updater, and some sprites)Junctioneer
(a traffic intersection simulator)