This could be done if we change the software and convince everyone to use the new version.
ByteCoin
Not necessarily. The key is used to sign the coins, and right now it's generated by the program. The REST of the program, however, doesn't care where that key comes from. I could write a custom client which accepted keys from the user, even if noone else did this, as it would just look like the program happened to generate that key for me. It would count as a new user, with a balance of 0 (aka, you couldn't "reprogram" your wallet to accept a different key, you'd have to make a new wallet, and send the coins from the old wallet to the new, so that they were signed by your "external" key.