messageOrEmpty
Returns this throwable's Throwable.message, or an empty string when it has none.
Centralises the nullable-message read so callers can surface an error string without repeating the null check; both branches are exercised by io.rekast.sdk.sample.utils tests.