Public earned badges via join.

This one might be a candidate for a view, reducing the number of objects
built, but the join reduces the number of trips to the PostgreSQL and
memcached.

Closes #469.