Embrace Errors! Architecting UVM Testbenches for Dynamic Error Injection & Handling