Distributed working is doable but most of the tools that make it easy are going to be internet based so you're going to struggle a bit.
First thing is to look for tools that don't demand being on-line continually. Look at distributed source control which can have mini-hubs in each office - something like Git. This means that they can sync when their connection is active and it's not a problem when it's not.
For communications, forums or something like 37signals Campfire, both of which keep a history of the discussions will be better than chat clients. That way when someone's connection disappears they can go back in and review what people were saying once their connection is back.
You also need to work on your processes. Two things I'd look at:
1) Don't assume that people have seen changes or received e-mails. Use read receipts and if you don't get a read receipt tell people they need to pick up the phone and make sure the person is aware. Make it the responsibility of the person communicating the change to get acknowledgement.
2) Divide work into chunks that programmers can work on for a few days at a time so day to day communication isn't so critical. That way if the connection does go down they're not going to be doing nothing as they'll always have things on their task list. If you can put whole chunks of the project out to different offices even better as they'll be their own little unit.