Let's look at Quake 3. It's spawned hundreds(maybe thousands) of great games, with properly syncronised multiplayer. How? It uses events. Let's make up an example of what some events might be:
ENTITY_EVENT_SHOOT
ENTITY_EVENT_DIE
ENTITY_EVENT_MOVE <- unsure about this, they might of synced what buttons were being pressed/held every update
ENTITY_EVENT_LOOK <- unsure about this too, viewangles might be sync'd every update
ENTITY_EVENT_RELOAD
and so on... The outcome is a nice and efficient level of syncronisation which is not too bandwidth intensive. I believe that if we can implement something like this for Vault-MP, we can have a fully functional multiplayer that doesn't lag.
There would ofcourse have to be some "adaptions". For example, only sending events if the event would be meaningful for the client. Let's say Malcolm is on the bottom of the map, and Sally kills a mole rat at the top of the map. This event shouldn't be sent to Malcolm because he wouldn't know it ever happened, or would it affect him.
As for NPC's, they'll have to be executed server side. . .