Syntax will no longer cause errors in IE8.

The `_publicSelf` get/set operator syntax was causing errors in IE8 (even if the code wasn't run).

I've updated this to use `Object.defineProperties` if that method exists. Also there's a couple of variable declarations that I've made defensive.