Add tree, cat, mv commands and upload directory placement
Four features implemented in parallel:
- tree: Display directory hierarchy with box-drawing characters.
Uses DirectoryTree::load_full() which loads both directories and
documents. Entries sorted directories-first, alphabetical.
- cat: Decrypt and print a document to stdout. Supports bare names,
paths, and AT-URIs. Handles both direct and keyring encryption.
- mv: Move or rename documents and directories. Destination resolution
handles trailing / (must be directory), existing directories (move
into), and non-existent names (rename). Cycle detection prevents
moving a directory into itself or its descendants.
- upload --dir: Place uploaded documents into a directory. Resolves
the directory path via DirectoryTree, calls add_entry after upload.
Closes #90, closes #154, closes #157, closes #158