Distributed Execution of Recovery Blocks: An Approach to Uniform Treatment of Hardware and Software Faults