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.

Note: when I tested it out on localhost, I didn’t see a way to actually downvote within the app, so I tested by manually calling the `upvotePost`, `cancelUpvotePost`, `downvotePost`, and `cancelDownvotePost` methods from my browser’s JS console.