When destination is a subdirectory of source, `cp_r` would enter an
infinite loop because the newly created destination directory would
be included in the file listing during recursion. This can **cause disk
exhaustion** if large files are present under source.
This adds a validation check that returns `{:error, :einval, destination}`
when copying on a subdir of the source path.
Also document typical error reasons including the new `:einval` case.