Unify all request failures under a single context-aware exception; add test cases (issue #19)