I don't think you'd even need dummy buildings for this, you could probably just store all the spy information locally in the Lua script, by looking at all players at the start of the game, storing the spy data for each and then updating that data on each player's turn. You won't need something like TableSaverLoader, since spy information is always in the game and you can re-store it on game load.
Receive faith upon recruiting a new spy or whenever a Spy levels up.
This one should be pretty easy. Since GetEspionageSpies() returns a table, according to Chrisy15, every turn you can check the length of the stored table for an Iranian player*, and it increases, give that Iranian player faith.
On level up is a tiny bit trickier - before you store the spy data for the current turn, go through the stored spy data you already have, and if a specific spy's rank has increased, then you give the player faith.
If a Spy kills an enemy spy, all Revolutionary Guards gain a level.
This is... possible, I'd say, but really tricky since there's no GameEvents for spies in the base game as far as I know.
I might be talking nonsense here, but what I'm thinking now, is that you store the spy data for
all players, and if someone's spy that was in an Iranian city - and isn't from that Iranian player - disappears (you can only lose spies from being killed, I believe), you can assume that the spy was killed by Iran and level up the Revolutionary Guards.
This hinges on the fact that a killed spy will decrease the spy count for the player. If not, then we'd have to examine what GetEspionageSpies() returns after a spy is killed. Examining the contents of GetEspionageSpies() in general is probably a good idea - perhaps create a Lua script that prints the information on each players turn, and then observe how it changes with the events in a test game.
(*Remember that you can't assume there's only one player that's Iran in the game, so you have to write the code to be adaptable to multiple Irans in the same game.)