renamed proto creation methods, and newFunctionExtend optimization

'newFunctionExtend' was always creating an anonymous
function whenever it was called. Now that callback is moved out,
pre-made and stored into a variable, and so is only created
the once.

Methods which are used for creating prototype chains,
have been altered so 'proto' is prefixed in their name.
This is to better distinguish them from the non-proto methods.