Signal dev here. Just wanted to make it clear that the GCM/FCM we send are completely empty. It just wakes up the app so we can fetch the encrypted messages, at which point we decrypt them and show them to the user.
I believe there is an API for hooking into notification text prior to display, which allows the Signal app to decrypt the message. The Signal server doesn't have access to the plaintext message in order to send it in a GCM.
Push notification from GCM should not contain any user data. It should be treated just like a notification to the app to check its event source and then display user notification with data sourced from there.