feat(push): module FCM backend — DevicesModule + PushService (no-op sans clé)

- Nouveau modèle Prisma Device (userId FK, platform, fcmToken unique,
  appVersion) + migration 20261020_add_device (non appliquée en prod).
- DevicesModule : POST /api/devices (upsert par fcmToken) et
  DELETE /api/devices (désenregistrement), DTO class-validator stricts.
- PushService (firebase-admin) : init lazy et sûre via
  FIREBASE_SERVICE_ACCOUNT_PATH ; no-op avec warning si la clé est
  absente/illisible — le backend démarre et fonctionne à l identique.
  sendToUser() via sendEachForMulticast + purge des tokens
  messaging/registration-token-not-registered.
- NotificationsService.create() déclenche le push en fire-and-forget
  (like, commentaire, repost, tag, mention, invitation, appel manqué,
  admin) : un échec push ne fait jamais échouer la requête.

Aucun secret dans le code. Aucun comportement existant modifié.
