refactor; populate functionality

added doc#populate
added Model#populate
standardize query,document,Model populate arguments

Model
.find()
.populate({
    path: "_creator"
  , select: "name age"
  , match: { age: { $gte: 21 }}
  , options: { sort: { age: -1 }}
})
.exec()

TODO
  needs to support multi docs + non Mongoose Documents & friends
  code is in non-working state
updated; mpath to 0.1.0
populate; tests; re-enabled
populate; tests; fix query option test
populate; add utils.array.flatten
fixed; rebase regression
update; mpath to 0.1.1
populate; working code (not-backwards compat)

currently retaining _ids for documents not found in populate queries
populate; no need for extra nextTicks
docs;
populate; now compatible with lean

closes #1260
refactor; internal document properties

A schema path beginning with $ is invalid in mongodb, so
we know that no user will use this.

closes #1171
closes #1184
populate; add doc.populated()
populate; doc.populated now gets/sets
populate; doc -> docs
populate; now backwards compatible

nulls and unfound documents no longer included in
populated paths (just like pre 3.6)
populate; more tests
populate; docs
populate; add unscientific benchmark

1 doc
=========================
3.5.5:   8211  completed
3.6-pre: 12358 completed

  ~1.5 x

10 docs
=========================
3.5.5:   1672
3.6-pre: 4708

  ~2.8 x

20 docs
=========================
3.5.5:   900
3.6-pre: 2752

  ~3.0 x

50 docs
=========================
3.5.5:   378
3.6-pre: 1252

  ~3.3 x

100 docs
=========================
3.5.5:   180
3.6-pre: 692

  ~3.8 x
model.ref.test.js -> model.populate.test.js