What is virtual memory paging, and how do operating systems use it to enforce memory protection between processes?