The same as D4890, but for `web`. Since we were already using `failed` as a truthy/falsy type (with the exception of when we wanted to store an error message), converting it to a `boolean` makes more sense and storing an additional optional `failureMessage` property allows us to still keep track of the failureMessage.
Doesn't actually depend on D4890, but adding it to the stack since they're closely related.