Eric,
You have to be careful when you say that "every process is allocated 4GB of memory". In a way, that's not really true.
Every process can use a maximum of 4GB of memory, but that isn't *allocated* per se. Memory is allocated dynamically by the OS at the request of the process. We want to make sure that folks don't think that 4GB is immediately sucked up by RAM and VM whenever you launch an app!
When you launch your app, only required chunks of the code are paged into the RAM. The app along the way requests more memory to go about its work, and the OS grants the memory, and the RAM the app uses grows dynamically. A well-written app can also release that memory back into the system when its through with it, which the OS is free to allocate to some other process.
When all RAM gets allocated (or a large part of it), the OS starts paging less recently used parts of that app or other apps to disk, to make room. You'll notice that if you have a lot of apps open, then go back to an application that is running, but you haven't used it in a while, you hear the disk moving as its getting paged from disk, and then some other app gets some paged from RAM to disk.
You are correct that "out of memory messages are outa here". The only thing you'll notice as your RAM fills up is increased time to launch apps and to switch apps.