utils: handle NULL container passed to libcrun_open_proc_file()
It's possible for this function to be called with a NULL container when
called from run_process_child() -> mark_or_close_fds_ge_than() after
close_range() failed (old kernel or restricted syscall)
Handle this by opening a temporary /proc fd, which can be closed
immediately in libcrun_open_proc_file()
There are no other callers of libcrun_get_cached_proc_fd() at this
point, but such users would not need to worry about this fd potentially
leaking as long as container is a valid pointer, and even if they do
cause a leak in the future it's always better than a segfault.