Make OpenDirectory fail if the directory doesn't exist

This is in line with what the hardware itself does.

It does this by splitting the initial directory opening into `Directory.Open()`, which will return false if a stat fails.
Then, `Archive::OpenDirectory` will return `nullptr`, and archive.cpp will return an error code.

Fixes #221