~str is mutable. error probably doesn't need a mutable string, though. either it's just an overlooked API (json is an old part of the codebase, doesn't really see a lot of attention) or what pcwalton said about calling something down the line.
~str isn't inherently mutable; it's an owned string, and so is mutable if placed in a mutable variable.
The reason it's used here is so that the error messages can be constructed at runtime e.g. `fmt!("line %u: trailing characters", line_number)`, if it was using &'static str (i.e. a compile-time literal) then one could only use hard-coded error messages.
Dependent typing would be throwing out the entire type system, and also be incredibly ambitious. Dependent type systems are great, but I think the Rust team made the right decision here.
All opinions aside: it doesn't matter that much what font you use. Use whatever you feel comfortable with. Switching fonts won't magically make you a better programmer.