Round shutter speed denominator and focal length to whole numbers
GrainExif gains formattedExposureTime and formattedFocalLength computed
properties that re-parse the server-supplied strings (which can include
trailing decimals like "1/500.0" or "35.0mm") and route them through
formatShutterSpeed(seconds:) and formatFocalLength(mm:) helpers.
Fast shutters (< 1s) always show as "1/Ns" with a whole-number
denominator. Slow shutters preserve one decimal of precision so 1.5s
exposures don't round to 1s. Focal lengths always show as whole "Nmm".
settingsLine now uses the formatted versions for focal length, fNumber,
and exposure time.
Comprehensive XCTest coverage in PhotoModelsTests including the parser
fallback paths (garbage strings, divide-by-zero, suffix preservation).