Move per-prototype `initialize` from `model/javascript` to the kernel.

In order for the javascript driver to create an async break between
calls to a node's prototype `initialize` functions, it needs to call
back into `kernel.execute` and iterate using the `execute` callback. But
kernel reentry is during replication. The driver can't make the extra
hop through the kernel to execute its script. It needs to execute it
directly.

This commit makes the kernel responsible for applying the prototypes'
initializers to the node. Using the new `initializingNodeFromPrototype`
handler, the kernel directs drivers to run the relevant prototype
initializers on the node. The kernel provides an async break between
initializations when needed.

Drivers only need to apply one initializer at a time. They no longer
need to search through the prototype chain and don't need to be
concerned about waiting for async operations from a prototype's
initializer to complete before calling a derived node's initializer.

An added benefit is that multiple drivers can perform partial
initialization correctly (such as if two scripting systems are active).
Previously, one driver would execute initialization for the entire
prototype chain without allowing the next driver to interleave its
initialization for the same nodes.

References #2417.