Sort problems in language track order. Fixes #2098
Switch to Postgres for tests
Merge pull request #2087 from bluerogue251/case_insensitive_user_query

WIP Switch to Postgres for tests
Refactor stats snapshot active record queries

My previous pull request made `Stats::Snapshot` worse by sprinkling
calls to `#to_i` in with a lot of the methods. I can't actually figure
out if/where this class is still used in the application, but in case it
is, this pull request tries to undo that damage and make
`Stats::Snapshot` better off than it was before I touched it.

1. Use more active record hash conditions and less sql string snippets

2. Using symbols instead of strings for created_at queries. This produces:
  `SELECT * FROM comments ORDER BY comments.created_at DESC`
  as opposed to:
  `SELECT * FROM comments ORDER BY created_at DESC`
which helps when joining to other tables that also have a created_at column

3. Simplify iso8601 time formatting method

4. Push some scopes further down, into the `Submission` and
`UserExercise` classes, from where their logic can be more easily
shared.
Merge pull request #2102 from bluerogue251/refactor_stats_snapshot_queries

Refactor stats snapshot active record queries
Add contact information to README. Fixes #2093
Simplify username finder queries

citext making things simpler :-)

Before, LOWER(username) had to be called for SQL queries finding users
in order for a case-sensitive match to be used.

Now that the users.username column is citext, the case insensitive
matching is taken care of automatically by the database and we can thus
simplify the finder queries.

The case insensitive behaviour was already nicely tested in:

```ruby
  def test_find_user_by_case_insensitive_username
    %w{alice bob}.each do |name| User.create username: name end
    assert_equal 'alice', User.find_by_username('ALICE').username
  end

  def test_find_a_bunch_of_users_by_case_insensitive_username
    %w{alice bob fred}.each do |name| User.create username: name end
    assert_equal ['alice', 'bob'], User.find_in_usernames(['ALICE', 'BOB']).map(&:username)
  end
```

And those tests continue to pass with this change.
Merge pull request #2104 from bluerogue251/simplify_username_finder_queries

Simplify username finder queries
Fix silly typo
Add high-level contributing info to README
Tell Bugsnag of Invalid Submission (closes #1719)

Add a custom "data" tab to the bugsnag message with the current
username, code, and path from the request for additional debugging
resources.

This can be tested locally with the following steps:

1. Register for bugsnag

2. Add BUGSNAG_API_KEY=your_key to the `.env` file at the project root

4. Make a curl request to the local dev server:

```sh
$ curl
  -X POST
  --data '{ "key": "vdv961",
            "code": "some code \n more code ... \n and more code",
            "path": "/some/path"}'
  "localhost:4567/api/v1/user/assignments"
```
Merge pull request #2105 from bluerogue251/notify_bugsnag_on_invalid_submission

Tell Bugsnag of Invalid Submission (closes #1719)
Display exercises available for nitpick in language track order #1720
Merge pull request #2108 from code-R/2091-nitpick-exercises-in-language-track-order

2091 nitpick exercises in language track order
Extend custom alert classes with bootstrap styling

This allows custom alert classes such as:
  .alert-notice
  .alert-error
  .alert-alert

To be styled by bootstrap as though we were using the standard classes:
  .alert-info
  .alert-danger
  .alert-warning
Merge pull request #2110 from bluerogue251/fix_mute_flash_message_styling

Fix flash styling
Use problem slug rather than relying on related exercise
Refactor stats page for clarity
Don't require login to look at stats
Add irc channel to README