User overridable `setup`, `loop` and `main` through `__attribute__((weak))`

Following the same pattern as in the case of `serialEvent`, I've done the following:
 * provide an empty implementation of the `setup` and `loop` functions;
 * mark all three functions (`setup`, `loop` and `main`) as `__attribute__ ((weak))`
  so that the user is able to override them with customized versions;

See issue https://github.com/arduino/Arduino/issues/1138

(This is another variant of the pull request #1139)