[whitespace] tabs -> spaces
Create a nav bar [#11]

* The stuff that was previously in <header> is now in <div.page-head>.
* Login is now in the header.
* The add-images link is now in the header.
* You can no longer view the add-images page at all when logged out.
Redirect to the current path after login [#13]

Upgraded flask-openid in the midst of debugging; the new wersion has
some security fixes so it stays.

Using g.user in layout.html.jinja instead of a local user variable
determines logged-in-ness correctly for all routes, regardless of
whether they pass in a user variable.
Use g.user in all templates, not a local user var

This just avoids an obnoxious class of problems where the user is
correctly logged in, but the controller forgot to tell the template.
Add some basic tests for logged-in display [#11]

(the changes in e50b28d6d94dc7e06b6828f941ccf40495dad8fd)
 Merge branch 'nav-header' into 'version-5'

Nav Header

Fixes #11
Fixes #13
Run cloudfront invalidations asynchronously [#10]

Fixes a problem where repeated uploads, or many resizes, would exceed
Cloudfront's simultaneous-invalidation limit (3 per distribution).
Previously, MaxInvalidationErrors were just ignored, leaving a stale
cache lying around.

As of this commit the README is a liar; you can no longer run this on
Heroku's free tier, since you need a worker dyno.

setup.cfg is necessary to direct nosetests to the right directory; a
couple implementation files need a celery_broker_url setting at module
load time, and nosetests was scooping them up before setUpPackage could
set the fallback default.

The Invalidate task could just be defined with a @task-decorated
function, but then I can't make that monkeypatching subclass in the
test.
Convert the README to markdown
Update the README to reflect the use of workers
Remove a line of debug output
 Merge branch 'invalidation-retry' into 'version-5'

Defer Cloudfront invalidations into a Celery worker
Remove some dead code

Not sure when this code fell out of use, but it's no longer reachable.
upgrade to Bootstrap 3
[whitespace] tabs -> spaces
Add a missing semicolon
Reduce noisy selenium output

Thanks, Alecxe on stackoverflow!
New add-image page [#5]

Note: in order to style the file input, there's a funny hack in place.
The file input sits in front of a button (actually a <label>), but has
opacity 0; its width and position need to be aligned just right with the
"select" button.

The nav-tabs' border rule needs extra specificity to override
bootstrap's defaults, presumably because CSS was designed by malevolent
spirits.

When the controller receives a file, it calculates a filename and tells
the page JS about it. From that point on, that has to be the filename;
recalculating it after reorienting isn't ok. So the filename is now
frozen on ImageTruck initialization.
Don't use post in the auth tests

At the time they were written, you could GET /add without auth. Using
POST /add coupled the auth tests to the internals of the add logic,
though, so now that GET /add requires auth, we can decouple it!
Extract some repeated code in ImageTruck
Fixes for edge-cases on async uploading [#5]

* if an image is smaller than 100x100, it won't have a thumbnail
    version, so try checking for the original. This, of course, means
    the original needs to be uploaded *after* the resizes.
* Upload thumbnails first out of all the resizes, so the JS can get at
    them ASAP.