Properly call virtual methods from inside virtual methods.

  The condition is simple, but was not properly tested, simple condition
was a method calling a super class virtual method, that would call back
a derived class method.
Understand return type when parsing data declarations.

  This allows code like:
class foo {
    type v;
    foo f(x) {
	return { x };
    }
};

what is expected to just work based on language semantics.
Do not allow overriding virtual methods with another prototype.

  This could be allowed with special code to "start over" the virtual
method, but due the way the language is implemented, make it a fatal
error and require the user to choose another name for the different
prototype.