I'm beginning to think this is not as simple as it looks, and many "accepted" answers here and in SO have alternative answers that criticize them. Here is what I have gathered so far
Most of what I gathered is from this SO question
Using IP - not accurate
For ex. in countries like Singapore there are limited number of ISPs and a smaller set of IPs which are available for home users
Also I think this is not effective in distributed brute force attacks
Using session cookie - easily to overcome, doesn't take long to erase a cookie and not effective in distributed brute force attacks
Using the username - exponential increasing timeout - can have workarounds
If I have a list of 1000 usernames, I'll try user1+password1, user2+pasword1, user3+password1... user1+password2, user2+password2
Using recapcha - good but you still need to know it's the same "user" (which can be doing a distributed attack, clearing their cookie, etc)
So I assume there is no perfect solution, but is there a considerably "good" solution approbed by any organization such as OWASP for handing throttling of failed login attempts?