Very poor implementation choice. Probably not chosen by the contractor (must be a requirement buried in the agreement somewhere).
Immediate authorization combined with an asynchronous state distribution (Card X free transfers until $TIME, Balance $N), or (Card Y Fruad, Ban!). A few free trips would be given out, but its easy to implement and those free trips won't be able to make any transfers. A small message queue for incoming/outgoing messages to handle persistence issues.
The catch is every card reader needs a copy of minimal state for every card in the system, but that would fit on a 2GB storage card without any effort and it can be very slow memory, so perhaps $15 per unit.
It may be required to be faster then you think (and added data per user) if you have to tap on and off. But not difficult...a simple mesh network (doesn't have to be fully connected).
Think of it this way. I tap on the 501 at Brant St and all the machines are wirelessly connected to the main machine on the streetcar. It records when I get on and deducts a set amount ($2.70). I then get off at Spadina and tap off. The 501 records this and must then transfer the updated information to the 510. I tap on when I get on the Northbound train. 510 must have the information from the 501 instantaneously (within 10 seconds as I ran to catch the streetcar). The 510 record must show where I got on and how much I paid. I then tap off the 510 at Harbord. It must close the transaction and record that I completed my trip and the transaction is closed.
But every other streetcar that went through Queen and Spadina when you transferred must also record that you may board and you have a valid transfer. So they will have an open potential traansaction waiting (which will then close after a certain time or a certain number of streetcars that go through the intersection).
The node connectors must connect and record my trip information on the local computer. So every time I tap off at a transfer point, all potential transfers must record my information in case I board that bus/train/subway/streetcar.
Each node will also record any changes to the balances of all users of the system whenever they update.
There would be a seperate node that connects to the internet/terminals for loading cards and would push out the data to all other nodes.
All nodes can be either connected via wireless (think of your LTE USB dongle) or via wired for underground services (static IP DSL with a very efficient route with a central hub at 150 Front)
To summarize, there must be a mesh that is designed to connect with each other at each transfer point in the system (and in special situations when they put a bus out of service). The nodes will share potential transfer information on users that tap off at the specific transfer point. The nodes will also share any changes in the balances of all users at all times. This is all very small bits of data (<256 per record) so it should not be hard to code it into a computer nor take long to transfer. Prioritization of data transfer would be important (#1 for taps, #2 for transfers and #3 for balances)
To be honest, give some university students some pizza, beer and a Raspberry Pi ($30) and they would have the source code and a sample software and hardware ready in a few weeks.
It becomes harder with distance based fares, time-limited travel and time-limited transfers. Again not rocket science but it would increase the amount of data reuqired to be transferred and the number of nodes that have to be updated with your transfer data. May degrade the system but I'm still thinking a few seconds to transfer all the data (and milliseconds to access the computer and approve the transaction).