ConcurrentCaller -- run a fixed number of concurrent async functions

If the functions return promises, the caller will wait until they're
fulfilled and slots open to start new functions.
Fix WebDAV file purging

Deleted files are purged at the end of every sync, without any delay.
(If there's a conflict, it will be resolved before the file is deleted.)

Orphaned files are deleted once every 10 days, since it's a potentially
expensive operation for the server.
Replace some uses of Q.allResolved() with Q.all() in storage sync
Fix WebDAV file sync conflict