text: Title: Use strongly typed IDs
  Body: ## Problem
  
  <!-- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -->
  
  Currently the following code (given that user and post have the same type for their ID field) will type check but is an obvious logical error:
  
  ```py
  post = await client.post.find_first()
  assert post is not None
  user = await client.user.find_unique(
      where={
          'id': post.id,
      },
  )
  ```
  
  ## Suggested solution
  
  <!-- A clear and concise description of what you want to happen. -->
  
  ID types should make use of `NewType` to show that they are distinct from the base type.
  
  This would, however, make working with non-autogenerated IDs more annoying as you would have to explicitly wrap the ID value with the type, for example:
  
  ```py
  from prisma.types import UserID
  
  user = await client.user.find_unique(
      where={
          'id': UserID('foo')
      },
  )
  ```