So, the current Bitcoin protocol allows senders to attach a (limited, not Turing-complete) script to the coins they sent - see
https://en.bitcoin.it/wiki/Script. This means that, given client support, I could take my coins and send them in such a way that several keys were required to unlock them; I could then keep these keys on separate computers, for security. Or perhaps I'm in an organization that requires a majority of the board of directors, so I require a minimum number of distinct signatures, or something complicated like that. The current Bitcoin client doesn't support these things, but the protocol does, so these features can be introduced unobtrusively. This scripting system is pretty cool, and, with a little more work and a few extensions, I think it could enable some pretty amazing security features. Since using online wallet services to add features has worked out badly so far, building security features onto the blockchain seems like the right strategy.
But suppose you want to publish a tipjar address, and require two keys to unlock any bitcoins sent to that. Unfortunately, this won't work, because senders aren't going to attach a script to the coins they send; and if you wanted to instruct senders to attach a script, there'd be no easy way to do it, because the Bitcoin address format doesn't support that sort of thing. I would have to receive the coins to a regular single-key address, then forward them along to a two-key address, leaving a window between receipt and forwarding during which someone who had stolen the single key could steal my coins.
Now suppose that instead of publishing an address that's the hash of my public key, I could instead publish an address that's the hash of an arbitrary script. Then, if I want to spend the coins along, I make a transaction containing both the script - which turns out to be a function that says I need some combination of signatures - and also the signatures that make the script return true. This seems like the right way to handle multi-key addresses.
This also seems like the right way to handle time-locked coins. Rather than use the nLockTime field, introduce two new opcodes to push the block number and the block date/time in which the transaction appears. Then, someone can set up spending conditions like "either these three parties all agree, OR two parties agree and it's been a month, OR one party agrees and it's been a year" - and designing and supporting these complicated conditions wouldn't require any support from the official Bitcoin client, they could set it up themselves and have it be completely transparent to everyone else.
The last remaining problem with split keys is how to handle the communication between the devices that hold the keys. This can be awkward - if you have one part of the key on your computer, and one part on your phone, they may be connected through different networks and both behind firewalls or NAT gateways. I think that the right way to handle this problem is to use the blockchain - first have one of the devices publish a dummy transaction that doesn't move coins around but which contains the transaction details and its signature, then have the other device detect the dummy transaction in the blockchain, and compose a real transaction using that signature plus its own.
There is one more feature which I'd like the blockchain to support, but which I'm not sure of the best way to implement. Suppose I have a big, long-term savings account, and I'm worried that someone is going to steal all my keys, including the master key in my safety deposit box. However, I still want to be able to stop them from spending my coins if that happens. So I put my coins in a special address, which is set up so that when someone initiates a spend, that spend is delayed 72 hours. During that time, I can use my private key to publish a "cancel" transaction, which causes the coins to become frozen until a transaction is published that's signed by both my key and by a third-party arbitrator's key. This would require receiver scripts, date/time opcodes, and also new opcodes for some sort of cross-transaction communication mechanism. Any ideas for what that mechanism should look like?