Ensure we get a user ID whenever we get a username, or work around that lack.

There were only two places where we could get a username without a user ID: scraping an ignored post, and scraping a private message folder.

When scraping an ignored post, it turns out the user ID is available in the td.userinfo. This is a relatively new feature enabling per-user CSS stuff. Done.

When scraping a private message folder, the user ID for the sending user simply doesn't exist in the markup. To work around this, I added a new attribute PrivateMessage.rawFromUsername. We'll display this when it's all that's available, but once we scrape the actual message we'll switch to using the old PrivateMessage.from relationship.
Require User.userID.

There are no longer any relevant cases when we know a user's name but not their user ID. Requiring userID makes equality and hashing work much better.