Support loose functions in mono

This PR is a result of a spike to get loose functions working in Mono
It’s not complete parity with Roslyn but has some nice features.

Currently working:
* Loose functions in scripts
* No need to define classes or functions before usage

Known issues
* Loose functions cannot call other loose functions
* Loose Block Statements messes up the parsing which can result in strange errors, but works if block statements are defined after classes and functions.
* This is actually a spike, so I have no tests yet.

Code example that this PR can run in Mono:
```csharp
public class Test
{
	public int Foo(int a, int b) { return a + b; }

	public int Bar() { return Foo(1,2); }
}

var test = new Test();
Console.WriteLine(test.Bar());

var person = new Person();
person.Name = "John";
Console.WriteLine(person.Name);

Console.WriteLine(Foo(66,33));

public int Foo(int a, int b) { return a + b; }

Bar(Console.WriteLine);

public class Person 
{
	public string Name {get; set; }
}

public void Bar(Action<string> action)
{
	action("Inside of Bar");
}

Console.WriteLine("Done");
```