[CORE] Reduce suprious IPIs when changing VCPU state

When VCPU changes state the most important thing is the updation
of host CPU ready queue along with the VCPU state change.

Currently, we were doing all VCPU state changes on the host CPU
assigned to the VCPU so that host CPU ready queue is only updated
by code running on host CPU. This means we would have an IPI for
each and every VCPU state change.

This patch attempts to reduce number of IPIs required for VCPU
state changes by updating a host CPU ready queue directly from
current host CPU. To protect host CPU ready queue we use per-host
CPU ready queue lock. Upon updating ready queue of a host CPU from
current host CPU, we also check whether we need to prempt current
VCPU on that host CPU. If premption is required on that host CPU
then we force rescheduling on that host CPU using dummy async IPI.

Signed-off-by: Anup Patel <anup@brainfault.org>