Debugger: debug symbol print fix

kernel/debugger/debugger.s:
	Fix the case where an exact source line cannot be found for
	a symbol, which resulted in an unexpected unrelocated symbol
	address.
Debugger: clear old breakpoints

kernel/debugger/hwdebug.s:
	on setting a breakpoint, clear the old ones.
	If the breakpoint address is not aligned, multiple debug
	registers are used, which caused partial old breakpoints
	to remain active.
[MAJOR STABILITY] Mutex: fix bug, add checks.

	SUMMARY

		This commit fixes many hard-to-reproduce weird bugs,
		such as memory management data corruption. These bugs
		would appear during development and would depend on
		how much code was added to the kernel.

		The problem was that mutexes got unlocked during
		the locking process. If the scheduler intervened during
		the execution of the three instructions or so between
		unlocking and locking, any concurrency-safe data
		would be compromised, including most notably the
		scheduler, the screen, memory, networking (on three levels),
		the filesystem, and the system clock.

kernel/debugger/debugger.s:
	debugger_print_mutex$: print release location also.

kernel/mutex.s:
	add MUTEX_TRACE to print lock/unlock.
	add globals.

	add mutex_released array to store where mutexes are unlocked.

	swap SCREEN/MEM labels to be consistent with MUTEX_* contstants.

	MUTEX_(LOCK|UNLOCK|LOCK_|UNLOCK_|SPINLOCK_):
	- check for lock acquisition/release failures and invoke the
	  debugger if so;
	- store the owner address (MUTEX_LOCK didn't)
	- store the release address

	MUTEX_SPINLOCK_ specific:
	- add optional SPINLOCK_TIMEOUT loop
	- Fix major bug where mutex was cleared if it could not be locked;
	  correct approach is to keep it locked.

	Disable (unused) MUTEX_SCHEDLOCK and MUTEX_SPINLOCK;
	add alias to MUTEX_SPINLOCK_ as MUTEX_SPINLOCK.
	(MUTEX_SPINLOCK (not _!) was only used in one place).

kernel/kernel.s:
	remove mutex globals.

kernel/print.s:
	improve PRINTCHARc argument handling.
NET: fix profuse socket unlocking

kernel/net/socket.s:
	socket_buffer_read: fix unlocking unlocked mutexes.
	socket_accept: use MUTEX_UNLOCK_ rather than MUTEX_UNLOCK
	(as they are implemented slightly differently).
SCHED,MEM: fix reentrant lock

kernel/schedule.s:
	add some notes on reentrant locking.

kernel/pit.s:
	get_time_ms_40_24:
	lock the scheduler around the MUTEX lock, preventing
	the task from being interruptable. This is required
	since the scheduler calls this method.

kernel/lib/handles.s:
	handles_alloc$: don't call mfree, rather call handle_free_by_base,
	to prevent recursion into MUTEX_MEM locked code.
	handles_validate_contiguous_address$: also check for negative size.