support systems where cpu# != apicid

- add an apicid field to struct cpu, don't assume id == apicid
- startothers() uses cpu->apicid when calling lapicstartap()
- cpunum() now walks the cpu table to back-map apicid to id
  this isn't too bad because cpunum() is only called from
  seginit() to initialize the cpu-local pointer to its struct cpu.
  Everywhere else uses cpu->id.

Now booting with two cores on an i3-4010u.