handleBlockResponseWithReason

Callback-based API that surfaces the full result including HSBotDefenderChallengeResult.SOLVED_WITH_ERROR together with the accompanying HSBotDefenderChallengeFailureReason when applicable.

The reason is null for HSBotDefenderChallengeResult.SOLVED. For HSBotDefenderChallengeResult.CANCELLED the reason indicates how the challenge was dismissed (e.g. HSBotDefenderChallengeFailureReason.USER_DISMISSED_BACK_PRESS).

Separate from handleBlockResponse so handleBlockResponse(response, url, null) stays unambiguous for delegate-only Kotlin and Java callers.