Drive resume / resumable upload (implementation)

Here is the minimum interface I came up with - this won't make sense unless you study the backend interfaces in fs/fs.go

Optional interface for backends

type Resumer interface {
    // Resume checks whether the (remote, ID) pair is valid and returns
    // the point the file should be resumed from or an error.
    Resume(ctx context.Context, remote string, ID string) (Pos int64, err error)
}

A new fs.Option for Put/Upload for doing the resuming - OptionResume
should not be passed in unless the backend supports the optional
Resume method.

struct OptionResume {
    ID string             // resume this ID if set
    Pos int64             // and resume from this position
    SetID func(ID string) // called when and if the upload knows an ID for resumable upload
}

operations.Copy would initially set just the SetID function pointer -
it would then call Put/Update and it would get called back with an ID
if a multipart upload was in use.

On the callback it would persist the ID along with the Fs, path and
the Fingerprint of the source object.

If OptionResume is passed in then the backend should not cancel
multipart uploads on failure.

If Put/Upload returned OK then the upload was successful so the on
disk metadata can be removed.

So when being re-run operations.Copy looks on disk for uncompleted
uploads for this (Fs, remote, ID) and checks that the fingerprint of
the source object hasn't changed.

If the fingerprint is unchanged then it calls the Resume method
If not then it calls this optional
method

If this returns an error then Copy carries on as usual.