6030a985fa
Adds clientIP() (reads the rightmost X-Forwarded-For hop via Header.Values, since Traefik appends the peer address it actually observed and the leftmost entries are client-controlled) and loginLimiter, an in-memory per-IP counter that blocks after loginMaxFailures within loginWindow. No routes wire these up yet — that lands in Task 5.