Better sync behavior


* Refactored internally do deal with RevisionInfo structs as opposed to string revision names that need to be unpacked.
* Changed sync behavior. The rule now is we don't download revisions older than min(current, previous). So ftl clients will have the ability to jump to either current or previous, but won't be able to go back further.
* Fixes sync behavior where a client might be asked to purge an old revision, but it's their current active revision. 
* Added the first unit test, just for the logic around picking what versions to sync or purge. 
* Some s3 operations are now done in parallel, which is hopefully a great performance improvement.
* Fixed character set encoding of revision hashes in filename, this should avoid characters that can't work as a git ref, at the cost of reducing entropy and ability to decode (which we probably don't care about)