code: public static void basicExample002() throws Exception {
  
          final SipRequest invite = SipRequest.invite("sip:alice@aboutsip.com")
                  .withFromHeader("sip:bob@pkts.io")
                  .build();
  
          System.out.println(invite);
      }
docs: All objects within SIP Lib are immutable. Hence, once an object, such as a
  {@link SipMessage}, a {@link SipHeader} or a e.g. a {@link SipURI} has been
  constructed you cannot change it. Therefore, all objects within SIP Lib make
  use of the builder pattern, allowing the user to construct the desired object.
  
  Furthermore, the builders offers up the possibility for registering lambda-functions
  to be executed when e.g. the Contact-header is constructed by a {@link io.pkts.packet.sip.SipMessage.Builder}
  and is a very powerful concept, which will be further explored by other examples in this file.
  
  By default, the builder will create an a SIP Request with
  the following default headers:
  <ul>
  <li>{@link ToHeader} - the request-uri will be used to construct the to-header
  in the case of a request. For a response you have to supply it</li>
  <li>{@link CSeqHeader} - a new CSeq header will be added where the
  method is the same as this message and the sequence number is set to 1</li>
  <li>{@link CallIdHeader} - a new random call-id will be added</li>
  <li>{@link MaxForwardsHeader} - if we are building a request, a max forwards of 70 will be added</li>
  <li>{@link ContentLengthHeader} - Will be added if there is a body
  on the message and the length set to the correct length.</li>
  </ul>
  
  @throws Exception