[delegate] Improve trampoline caching

Both of those cases don't seen to handle ldvirt delegates. Did you check for then?

For generic I'm talking about something like this:

using System;

class Foo <T> {
	public virtual int Test() { return 10; }
}

class Bar<T> : Foo<T> {
	public override int Test() { return 20; }
}

class Test<T> {
	public void Run () {
		var arr = new[] { new Foo<T> (), new Bar<T> () };

		foreach (var i in arr) {
			Func<int> f = new Func<int> (i.Test);
			Console.WriteLine (f());
		} 
	}
}

class Driver {
	static void Main () {
		new Test<string> ().Run ();
	}
}