Rename Regiser/Unregister and revise the function arguments

1. Register()   -> AddObserver()
2. Unregister() -> RemoveObserver()
3. Use two observer lists and observer pointers to handle always/non-always
   trigger case