[vm] Re-do in terms of ported Contextify code.

Ported from https://github.com/brianmcd/contextify but with many
changes to fit into the Node.js codebase.

This is similar to node_script.cc, which formerly backed vm.js, but it
actually works well (see #3042).

As of now, it does not support the context <-> sandbox conflation that
the current vm module supports; the tests are updated to reflect that.
It also does not support the timeout parameter. Further commits will
reintroduce these features.

New tests are included to demonstrate what was fixed versus the current
vm module.
[vm] Reintroduce context <-> sandbox equality.

Contextify distinguishes between the sandbox, which is what is passed
in to the vm module and is the global object for a given context, and
the context itself, which is a C++ object in which scripts can run.

This commit hides the context from the user-facing interface, just like
in the vm module in Node.js 0.10 and lower. Users of the vm module only
deal with the sandbox objects, which internally are translated to their
corresponding contexts.