Added support for interface for the case they implement flag.Value.

Also did lots of tweaking and clean-up.
Use special error type ErrorInvalidDefault.