Don't use Events.SerialEventUnitCreated for the reasons Bob noted, particularly the fact that it fires for all of your units when you load a saved game. I doubt it could be stretched to your purposes anyway though.
No useful event is fired. It'd be relatively simple for a skilled C++ coder to create an event in the DLL, but that's overkill given how it would break compatibility with many other mods.
You don't actually need that to achieve what you want to do, though. Listen for the end of turn event. When it fires, cycle through all the cities of that player. For each city, check if it has the building in question. If it does, check if it has a unit in it*, and if it does, do your logic to that unit.
* I don't know how straightforward this is but I'll bet it's possible - it might be as simple as City.GetGarrisonedUnit() or some such, but it might be as convoluted as finding the X,Y coordinates of the city and checking that hex for a unit, or even finding the X,Y coordinates for each unit owned by the owner of the city and comparing their X,Y coordinates of that unit to the X,Y coordinates of the city. You may have to get clever, but it should be possible.