* feat: sftp
test: add tests for ftp and sftp
* chore: ci fixes
* chore: potential race fix
* fix: simplify existence checks
* fix: split path differently for ftp
* fix: 🤷
* chore: add debug print
* chore: lint
* chore: idk dude
* chore: ?
* chore: more logs
* chore: wipe mods before tests
* chore: logs
* chore: wat
* chore: wait?
* chore: no errors
* chore: gh actions are 💩
* fix: always sync after copy
* chore: remove some test logs
* chore: remove test progress watcher
* refactor: change progress to writer
* chore: logs
* chore: different logs
* chore: whoops
* chore: moar logs
* chore: even moar logs
* chore: what is life
* chore: why are we here
* chore: we are just bags of water floating through space
* chore: are you real?
* chore: ?
* chore: if you get a single update now I call bs
* chore: ok what if we just do one?
* chore: ok what if we do two?
* chore: this should not work
* chore: wait no, this one
* chore: fml
* chore: remove logs
* chore: what if we just wait a little
* chore: retry
* chore: move error
* chore: verbose log
* chore: remove explicit sleep
* chore: remove debug
* fix: linux pathing on windows
* fix: clean paths properly
* fix: fuck ftp
* fix: send update on vanilla
* feat: parallel ftp
* fix: remove potential credential leak
* refactor: separate resolving tests
* feat: use pubgrub to resolve dependencies
* feat: show friendly mod name in error message
* feat: show single version in error message when only one matches
* ci: update go version to match go.mod
* feat: format FactoryGame incompatibility and term
* chore: fetch all necessary data of the version at once
* chore: upgrade pubgrub
* chore: upgrade pubgrub
* ci: update golangci-lint version for go 1.21
* chore: lint
* chore: update go version in readme