List message decryption failures on chrome://gcm-internals

This CL is basically just plumbing of a result code to an internal
diagnosis page. Decryption is done at the level of the GCM Driver,
while, for desktop, the GCMStatsRecorder is owned by the GCMClient
several layers down, on another thread.

This is a re-land of the following CL, which got reverted due to
flakiness on iOS: https://codereview.chromium.org/1616113003/

The flakiness is addresses by pumping the loops in the order in
which messages are posted to the other threads.

TBR=jianli
BUG=569127

Review URL: https://codereview.chromium.org/1641993004

Cr-Commit-Position: refs/heads/master@{#372644}
diff --git a/components/gcm_driver/gcm_driver_android.h b/components/gcm_driver/gcm_driver_android.h
index 4316c69..20345db 100644
--- a/components/gcm_driver/gcm_driver_android.h
+++ b/components/gcm_driver/gcm_driver_android.h
@@ -92,6 +92,9 @@
   void SendImpl(const std::string& app_id,
                 const std::string& receiver_id,
                 const OutgoingMessage& message) override;
+  void RecordDecryptionFailure(const std::string& app_id,
+                               GCMEncryptionProvider::DecryptionFailure reason)
+      override;
 
  private:
   base::android::ScopedJavaGlobalRef<jobject> java_ref_;