log etag on the same line as S3 get, just to make debug less spammy
when _expectHttpCode makes an error out of an unexpected HTTP code, assign that code as a property on the error object

makes for better debug output if nothing else
fs.create*Stream functions don't throw synchronously, whoops
shift knox client creation around a bit

we don't need to create it every time we call saveMedia - just create it once and put it in a task-level var. no longer need to pass it between functions either.
try and resume partial downloads
oh, turns out etag headers have a grammar
need to check whether to retry in a few places. pull that procedure out into a function
name those error params, it's getting confusing