(Bug 5027) Pass up the error message to the caller

This lets us recover from the error state and fire off error messages 
properly. It also means we get to choose whether to retry or not
(instead of catastrophic failure all the time)