Format strings type-safely with combinators