Make upvote cleanup prior downvote and vice-versa

Currently if a user upvotes and then downvotes the same post (or vice-versa), her original vote isn’t cleaned up properly. She will end up being in both the `upvoters` and `downvoters` sets and the score from her votes will total 0.

This commit checks during `upvotePost` and `downvotePost` if the user has performed the opposing action and it updates the Post accordingly, e.g., double the vote strength and cleanup the voters sets.