The Hidden Complexity of Distributed Rate Limiting: Lessons from Building 5 Algorithms