Wrap everything in a self-invoking anonymous function

1. Wrap everything in a self-invoking anonymous function so we don't pollute the global scope with variables like `main`
2. Use a function declaration instead of a function expression for the `arePropertyDescriptorsSupported` function
3. Cache `undefined` so it gets renamed to something shorter when compressed