json: split default de/encoding into `Json`, `Decodable`, and `Encodable`