Unification of Function, DSFunction, and DSVarArgFunction

This includes the work done for #1841 Partial Application for Multi-Output nodes.

In a nutshell, this refactors the three classes in the title into a more organized inheritance hierarchy. Fundamentally, all three types of nodes represent a function call, and indeed all three compile down to a FunctionCall AST (or, in the case of partial application, a _FunctionObject).

In order to simplify things, all code dealing with specifics around what kind of function is being applied has been refactored into a separate class hierarchy of `Controllers`. This way, the logic that keeps nodes synchronized with a function definition is separate from the actual NodeModel. Hopefully this will help with testing in the future.

@lukechurch @ke-yu @junmendoza
please turn this into a string assignment followed by returning the string to make it more explicit what is being returned. The nesting here is a little excessive