refactor: dtype codec uses proper jsont error handling
- parse_typestr returns (dtype, string) result instead of raising
- Simple dtype uses Jsont.of_of_string (result-based, proper errors)
- Structured dtype uses Jsont.Error.msgf for decode errors
- decode_field and decode_shape return result types
- No more invalid_arg or manual JSON AST matching in dtype codec
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>