Java8 lambda/method reference language support

Includes James Nelson's upstream

Fix lambdas to appear as the expected type

Previous implementation created lambdas as the type of the
single abstract method being implemented, rather than expected
type in method signature.  To fix this, we correctly type the
anonymous type (and return the correct class from .getClass())

Add java8 emulation for common functional interfaces

Change-Id: I0b8c941f99a2e6869c5206bbbde0450ca6a80f64