Different approach for using JS arrays in native functions and GetProperty simplification

So far we've used std::vector<CScriptValRooted> as a representation of JS arrays in native functions. This made the code a bit less dependent on JSAPI changes (which unfortunately happen very often). The problem was that this required a ridiculous amount of conversion operations when passing arrays from JS to C++ and back. Now with exact rooting, it would require additional work to get the old functionality back and it would add even more overhead for the rooting of temporary objects during conversion.
The better approach seems to be using the JSAPI directly for working with arrays and passing arrays as JS::Values. We don't use JS arrays from native code very often and even with API changes, it should be trivial to adjust that code (probably easier than maintaining the conversion code to std::vector<CScriptValRooted>).

This changeset also makes GetProperty use an overload instead of a template specialization for JSAPI out parameters. Templates don't really help there because the JSAPI function JS_GetProperty in not templated and only supports MutableHandleValue out parameters. This also makes it easier because the templates don't support implicit conversions (like JS::Rooted<T>* to JS::MutableHandle<T>), so we had to manually write a specialization for all required implicitely convertible types.