Make public_dir a lazy attribute

Using BUILD to populate an attribute in this was is not best practice.
Requied with a default, or lazy and provide a builder are obth better
solutions.

Go for the later, to allow the public_dir config to to altered up to
the point Handler::File is registered.
Only pass public_dir to Handler::File is using system paths

Allows the builder on the lazy public_dir to provide the appropriate value
Update hander_file tests to set public_dir via settings.

Closes #605
reflect changes
Merge branch 'bugfix/setting_public'