Basic shadow datatypes

@markhibberd @maxpow4h @etorreborre @charleso @raronson 
Don't create companions unless you actually need it. It actually changes the api (removes Function* implementation)