Updated the AbstractModel.read() method to be more flexible

- Models are now searchable by fields other than ID as long as it
  uniquely identifies that model
- Uses LIMIT 1 so if there are more than 1 then it will choose
  randomly