Add redis and start saving joke data.

'channel' is just hardcoded for now, as there won't be a reason to
use more than one channel for a while. This is a pretty weird way
to use redis I bet (I'm basically making it behave like a
relational database), but, well, I'm an idiot and I'm sure as heck
not going to install python mysql things. I hate those.
Extract joke generation from view.

This was a big ol' pile of mess, and it still is pretty much that.

The mess is just a teensy bit smaller, now.
Fix longstanding off-by-one error.

This had been ripping an innocent word out of the nonsense that
X11R5 generates. What a disaster! X11R5 spits out things that
do not really make sense, but when you go dropping a word out
right in the middle of the sentence, they only get harder to
comprehend.

The nonsense is now 80% more sensible, and hopefully 100% funnier.
Extract saving from joke generation.

These are separate concerns, and this is leading to a slightly
higher order class.
Refactoring to kill globals.

Things have to be moved around here so that 'save_joke' exists at
the point that it is being called. Everything works here, so this
is getting committed before we move on.

This is part of a series of commits aimed at making views
responsible for a minimal amount of logic, and making jokes easy
to retrieve by identifier.
Kill the last global variable.

Jokes are now retained as long as the server is up.

Resets now just straight-up generate a new joke, instead of making
the "last_time" be further back in time than it really was -- which
has the wonderful benefit of putting the reset load on me as the
admin, instead of on the next viewer to hit the page after I
trigger a reset.

The time logic is also pretty isolated now, and might get broken
into a utility function.
Add method to retrieve a given joke.
Add view_by_id route.

Now that all the surrounding code got out of the way, this is
pretty easy. :)
Break out Jokes class from views.

These functions were entirely isolated, and they are very close to
representing just database operations and the logic around database
operations. I'm not going to go so far as to make a DAO and DTO,
but it's nice to put them in a new place.
Add getters for next and previous existing joke.

These search forward and backward through the jokespace for jokes
that actually exist, and return them. They will be used for
implementing back and forward functionality.
Add next/previous links to views and template.

The previous link loops around to the newest if you go too far
back in time! That's a feature, not a bug! (... hush)
The CSS... it works.

By using bootstrap and putting absolutely positioned tags within
relatively positioned tags, the gif background is finally centered
horizontally and vertically, and the top and bottom text are stuck
to the top and bottom, respectively.

Phew.
More CSS working. Clickable image sides.