James Whitehead II:
	- Add a basic test suite
	- Fix several bugs with mouse-button-based bindings
	- Add an addon-wide index/newindex debug mode
	- Hide UI panel when spellbook is hidden and both are open
	- Fix another corner case where escape could get eaten
	- Fix the issue that was causing escape to be eaten
	- Disable button-based hovercast/global bindings on unit frames
	- Fix the 'Select None' button in the frame blacklist editor
	- Remove debug message
	- Ensure onenter/onleave attributes don't get 'stuck'.
	- Only register clicks on enabled, non-blacklisted frames
	- Some comment and text updates
	- Fix bindings with non-latin keys, such as ö
	- Enabled frame unregistration
	Addons that are registering using ClickCastFrames should run
	ClickCastFrames[frame] = nil or ClickCastFrames[frame] = false.
	
	Addons that are using the group header, and are registering using
	the secure snippet method should do the following:
	
	local header = self:GetFrameref("clickcast_header")
	header:SetAttribute("clickcast_button", button)
	header:RunAttribute("clickcast_unregister")
	
	This code expect to be run on the header, but needs access to the
	button. This can probably be passed into your header via a frame
	reference, i.e:
	
	MyGroupHeader:SetFrameRef("foo", MyGroupHeaderUnitButton1)
	MyGroupHeader:Execute[[
	  local button = self:GetFrameRef("foo");
	  local header = self:GetFrameRef("clickcast_header")
	  header:SetAttribute("clickcast_button", button)
	  header:RunAttribute("clickcast_unregister")
	]]
