A message stuck in a failed state used to tell you nothing beyond "failed". The information you need — 550 5.7.1 relay denied, quota exceeded, invalid recipient — was in the server's response and was being thrown away.
The rejection reason is now stored on the message and shown in the interface, and the corresponding campaign log entry is marked failed rather than left hanging in an ambiguous state.
Transient failures are also handled properly: temporary SMTP errors are retried rather than treated as permanent, so a five-minute outage at your provider no longer costs you a batch of leads.