text: Title: Consider refactoring Base64 API
  Body: ## Problem
  
  <!-- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -->
  
  It is not obvious how `Base64` objects should be constructed, it would be a very easy mistake to construct the object like so:
  
  ```py
  data = Base64(b'my binary data')
  # when it should be
  data = Base64(base64.b64encode(b'my binary data'))
  # or
  data = Base64.encode(b'my binary data')
  ```
  
  ## Suggested solution
  
  <!-- A clear and concise description of what you want to happen. -->
  
  One solution to this would be to disable construction through `__init__` and instead require a classmethod to be used, the API would then look like this:
  
  ```py
  data = Base64.from_data(b'my binary data')
  data = Base64.from_b64(base64.b64encode(b'my binary data'))
  ```
  
  We would then deprecate the previous API and remove it in a later release.
  