This diff introduces changes to the FCM library wrapper and `fcm_status` shared `enum`.
To distinguish common errors and wrong/expired device token errors the function should return different results.
Following a current keyserver's approach we should check for the following errors:
- For `NotRegistered` response which is similar to the [[ https://github.com/CommE2E/comm/blob/088c3d06da341b88a1ed9f0ae925f67c6526211b/keyserver/src/push/utils.js#L20 | keyserver's check ]].
- For `InvalidRegistration` response which is similar to the [[ https://github.com/CommE2E/comm/blob/088c3d06da341b88a1ed9f0ae925f67c6526211b/keyserver/src/push/utils.js#L20 | keyserver's check ]].
To pass the different errors to the C++ level the best and most elegant way is to return `enum` as `Ok` Rust result which formats like:
```
enum fcm_status {
Ok,
InvalidRegistration,
NotRegistered,
}
```
and use CXX shared types.
Because when can't distinguish error types from Rust on the C++ side, they are always `rust::error` type and have only `what()` method.
Also, we will catch the common errors which are not needed to be distinguished using the `catch` approach.
Related Linear task: [[ https://linear.app/comm/issue/ENG-1764/distinguish-common-and-wrongexpired-device-token-errors-in-rust | ENG-1764 ]]