Use an interface to pass the implementation, we don't need to know about the actual implementation classes
remove some unused/awkward constructors
stronger Builder typing
split the BaseHttpRequest.Builder into an AbstractBuilder and a final Builder of the enclosing type
fix typed Exception handling