a79700b11c
- Wrap hash_password calls with tokio::sync::Semaphore (max 2 concurrent) - Prevents Argon2 from monopolizing CPU cores and starving async tasks - Caps peak RAM from unbounded to ~38 MB for concurrent hash operations - Uses spawn_blocking via injected PasswordHasherPort to avoid blocking Tokio