It has been mentioned before but create something like Bitcoin. Most of the problems with Bitcoin are when people have their unencrypted wallet stolen. This would not be as much as a problem because the ballot which could be a form of virtual e-money would not be issued until the day of the vote so their would be no wallet. The voter could then send the ballot to the address of which candidate they would like to vote for over the p2p voting network. Votes could be counted within a short amount of time by watching the transactions that are sent to the candidates public address which would make voting fraud or changing the vote harder. Voters could pick up the ballot/bar code/qr code at a voting office and then vote at home, over a phone, library or at the polling station, etc. You would not need to wait around once you have a ballot. The voting software could create a pseudo-anonymous address that would be hard to track who the voter was but it would also allow the voter to verify that their vote still went to the correct candidate by viewing the p2p voting log.