Optimize model class methods

No Issue
- Reduce number of promises that are generated. Do not go async
  in a method unless it's needed.
- Reorder promise chains to defer database queries until they
  are needed.
- Execute database queries that are not dependent on each other in
  parallel instead of sequentially.
- Reduce the number of variables used to hold state across multiple
  promise blocks.