How do you implement robust error handling, retries, and alerting in a distributed data pipeline at Kharon?