Java8 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
Java8 defender methods

Change-Id: I172d61c0c039810d3f817d757ae9e2e3910c3828