Just make the Abstract Syntax Tree your canonical "code". If you want to work in text, a tool (perhaps built into your IDE or VCS client) translates the AST to text, in the programming language, dialect and style of your choice. Type/variable/class names are pretty much the only thing you'd want to preserve, but there's no reason you have to have exactly one of them if you wanted to translate to multiple languages.
Regarding #5, I'd actually love to see a type system augmented with a description of /what/ is stored in that type. Meaning shouldn't be hidden away in camel-case variable names; I should be able to say "this is a credit card number" in a globally unique, machine-readable way.