As discussed in IRC, this logic needs a bit more work:

1) The year, month, day and hour units will all change on each "1 unit" of time, rather than "`value` unit(s)" of time
2) When the unit value is larger than the unit max (e.g., 90 minutes > 60 minutes), the expiry will always be at `value` units past the current unit (e.g., if `value` is 90 minutes, the result of the expiry will always be 30 minutes past the next hour), which means the signature will change every hour rather than every 90 minutes.

Maybe first find how many millis the current unit represents (e.g., 5 minute = 300000), let `unitMillis = 300000`, then do:

`floor(Date.now() / unitMillis) * unitMillis + unitMillis` ?