Create Shutterfly lib

Since we'll be doing a lot of hitting the same URLs and parsing XML, that's now
refactored into `shutterfly/lib`. Just hand it your callback and you can pretend
everything's JSON.
Build Shutterfly proxy

Handles `GET` requests. Others don't work yet because we're not used to
accepting XML to pass along. I don't want to accept JSON and transcode it
because there's too much data to infer and the proxy should be a drop-in
replacement for the original API anyway.
Accept non-GET requests via Shutterfly proxy

Express/Connect appears has removed both the old `req.rawBody` parameter (for
memory reasons) and the ability to add custom parsers for specific MIME types
(for unknown reasons). This reintroduces the `rawBody` field for `POST`s to us
only of type `application/xml` (for minimal impact reasons) so that we can pass
it along to Shutterfly. Since we don't actually care what's in it, I haven't
bothered to parse it.

Beyond that, Shutterfly requires that the app ID be sent along with non-GET
requests. Don't know why, since the access token is presumably already tied to
an app.
Add albums synclet

This syncs your Shutterfly albums, which contain photos. The album `id` is
parsed out of what Shutterfly reports, because they give us the full resource
URL. The `at` is derived from the album's `updated` stamp.
Add photos synclet

This is a slightly different pattern from our other photos synclets. Instead of
conflating the albums fetch with the photos fetch, we just reenqueue the photos
task if albums haven't synched yet. If the user actually has 0 albums, this may
cause trouble, but everyone is started with 2 albums upon signup, so we'll deal
with that when we find the guy who deleted them and didn't add anything new. We
could simply set a config flag from the albums synclet saying it's run once and
use that to tell the difference between not-run and empty.

Shutterfly's API doesn't appear to have any concept of paging, so we'll see what
happens when we find a big album.

Their default photo URLs are also cropped, which is sad, and the
[size selection](http://www.shutterfly.com/documentation/api_Proctaserv.sfly) is
obtuse. We can pick a known-sized uncropped image, but the `raw=1` parameter
that is supposed to work has no effect. I'm leaving it alone while I track down
someone from shutterfly to ask about it - their
[support email](mailto:developerhelp@shutterfly.com) bounces. The docs also say
we need to sign the album request, but it's working without. I'll try it to see
if it makes `raw` work.
Make photos synclet behave when there are 0 albums

Instead of looping forever, the photos synclet can now tell whether the albums
synclet has run at all. If it hasn't, we'll wait, otherwise there's nothing do
to.

If there's a problem with the albums synclet and the run time doesn't get saved,
it's possible for photos to loop forever. We'll figure that out when we hit it.
Add Shutterfly photos to /types/photos

Shutterfly's sizing API is stilly, but here are big-ish and small-ish versions
of the photo for OEmbed. I'm going to try signing the request to see if we can
get the raw version out, but want to get this in and Good Enough™ to launch
for now.
Merge branch 'shutterfly'

* shutterfly:
  Add Shutterfly photos to /types/photos
  Make photos synclet behave when there are 0 albums
  Add photos synclet
  Add albums synclet
  Accept non-GET requests via Shutterfly proxy
  Build Shutterfly proxy
  Create Shutterfly lib