FIX: automatically expire bad push channels (PR #13156)

Previously we would retry push notifications indefinitely for all errors except for ExpiredSubscription

Under certain conditions other persistent errors may arise such as a persistent rate limit.

If we track more than 3 errors in a period of time longer than a day we will delete the subscription

Also performs a bit of internal cleanup to ensure protected methods really are private.

GitHub

This pull request has been mentioned on Discourse Meta. There might be relevant details there: