Reflective Architectures for Reusable Fault-Tolerant Software