Add zero-byte rejection and duplicate handling to remote sync
- Client: skip 0-byte files in _handle_message() before SHA256 computation
- Server: skip 0-byte files in ingest_upload() before processing
- Client: parse "duplicate" upload response and immediately confirm
segment instead of entering the confirmation polling loop
- Change upload_segment() return type from bool to UploadResult
NamedTuple carrying success + duplicate flags