v0.10.1

 ## Added
 - An FTP check. It logs in with a username and password, or anonymously when auth is left
   empty, retrieves one file in passive mode, and passes when the file exists, equals some text,
   contains it, matches a regex, or has a given SHA-256, MD5 or SHA-1 digest. The file contents
   are kept as result data even when the match fails
 - The FTP check fails a file over 16 MiB or a control conversation over 64 KiB, and times out
   after 30 seconds when the round gives it no deadline. A malformed passive reply fails the
   check instead of crashing the minion

 ## Changed
 - N/A

 ## Fixed
 - Closing the "Report graded." message after grading an IR report went to
   `/admin-panel/ir-reports/{team_id}/submissions`, which does not exist. It now goes back to the
   submissions list
 - A check's saved settings showed a nested group, auth credentials or each repeated item with
   its own numbered section headings. They now render as plain rows under their parent
 - A check's saved settings show an enum's label, such as "File contains", instead of its raw
   value `substringMatch`
 - A field marked hidden in a check schema lost the flag when the schema was built, so it still
   showed