more permissive scrutinee types in virt pattern matching

this commit adds support for definitions like this:

def runOrElse[T,U](in: RandVar[T])(matcher: T => RandVar[U]): RandVar[U]

previously, `in` was restricted to have type `T`