map
Maps T to a problem built from the call and the exception.
Mapping Throwable itself is legal and replaces the built-in catch-all wholesale, cancellation guard included. A handler registered that way must rethrow CancellationException itself. Prefer onUnmapped, which keeps the guard.
inline fun <T : Throwable> map(type: ProblemType, noinline detailFrom: (T) -> String? = { it.message })(source)
Maps T to type, taking detail from the exception message by default.
title is always ProblemType.title. §3.1 says it SHOULD stay constant across occurrences of a type, so there's no per-call override. Localization, the one exception the RFC allows, is out of scope for v1.